読者です 読者をやめる 読者になる 読者になる

Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

Ruby | Collecting Inputs | Use built-in conversion functions

Confident Ruby Ruby

概要

Use built-in conversion functions

前提

Confident Rubyではメソッド内の処理を次のように分類しています。
・Collecting Inputs(引数チェック、変換など)
・Performing Work(主処理)
・Delivering Output(戻り値に関わる処理)
・Handling Failure(例外処理)

当記事は上記のうち、Collecting Inputsに関する話です。

詳細

状況

元の型がなんであれ、coreな型に変換したい場合。
例えばどのような入力でもIntegerを強要したい。
Float,nil,16進数の文字列など。

概要

RubyのCapitalizeされた変換関数を利用する。
例えばKernel#Array, Kernel#Integer

理由

メソッド内でcoreな型を利用する場合、変換関数を事前に利用すると最大のflexibillityをもたらす。

Capitalizeされた変換関数の特徴

・冪等性(idempotent)がある。対象の型でなければ変換結果を返却する。対象の型であれば元のオブジェクトをそのまま返却する。
・to_xxx系の変換メソッドよりも対応範囲が広い

サンプルコード仕様

様々な入力を変換関数で配列に変換して、各要素に-hogeを追加して標準出力する。

サンプルコード

require 'pp'

def each_hoge(arrayify)
  array = Array arrayify
  puts "@@@@@@@@@@#{arrayify.class}@@@@@@@@@@@@"
  array.each do |value|
    puts "#{value}-hoge"
  end
  puts "@@@@@@@@@@#{arrayify.class}@@@@@@@@@@@@@"
end

class Numbers
  def initialize(*args)
    @nums = args
  end

  def to_a
    @nums
  end
end

each_hoge([*1..3])
each_hoge("test")
each_hoge({key1: :value1, key2: :value2})
each_hoge(Numbers.new(1, 2))

出力

@@@@@@@@@@Array@@@@@@@@@@@@
1-hoge
2-hoge
3-hoge
@@@@@@@@@@Array@@@@@@@@@@@@@
@@@@@@@@@@String@@@@@@@@@@@@
test-hoge
@@@@@@@@@@String@@@@@@@@@@@@@
@@@@@@@@@@Hash@@@@@@@@@@@@
[:key1, :value1]-hoge
[:key2, :value2]-hoge
@@@@@@@@@@Hash@@@@@@@@@@@@@
@@@@@@@@@@Numbers@@@@@@@@@@@@
1-hoge
2-hoge
@@@@@@@@@@Numbers@@@@@@@@@@@@@