case
Ruby 2.0 のステートメントでproc が許可されていたことを覚えていますが、Google で検索することはできません。
Ruby 2.0.0 NEWSとHow to write a switch statement in Ruby を調べてみました。http://ruby-doc.orgにもアクセスしましたが、キーワードのリンクは Ruby 2.0 ではなく Ruby 1.9 のものでした。
case ステートメントで proc を使用できますか?
case
Ruby 2.0 のステートメントでproc が許可されていたことを覚えていますが、Google で検索することはできません。
Ruby 2.0.0 NEWSとHow to write a switch statement in Ruby を調べてみました。http://ruby-doc.orgにもアクセスしましたが、キーワードのリンクは Ruby 2.0 ではなく Ruby 1.9 のものでした。
case ステートメントで proc を使用できますか?
はい。
2.0.0p0 :001> lamb = ->(x){ x%2==1 }
#=> #<Proc:0x007fdd6a97dd90@(irb):1 (lambda)>
2.0.0p0 :002> case 3; when lamb then p(:yay); end
:yay
#=> :yay
2.0.0p0 :003> lamb === 3
#=> true
2.0.0p0 :007> lamb === 2
#=> false
ただし、これはProc#===
当時定義されていたため、1.9.1 と同じです。ruby-docs ではこの方法を示すのに問題があるように思われるため、明確にするために、ドキュメントには次のように記載されていproc === obj
ます。
obj
のように proc のパラメーターとしてブロックを呼び出します#call
。when
proc オブジェクトを文中の句の対象にできるようにするためcase
です。
Ruby の初心者の場合when
、Ruby のステートメントの then 句はcase
、句の値を取得してメソッドを呼び出し、===
引数を case ステートメントに渡します。たとえば、このコードは…</p>
case "cats"
when /^cat/ then puts("line starts with cat!")
when /^dog/ then puts("line starts with dog!")
end
…/^cat/ === "cats"
一致するかどうかを判断するために実行します。このRegExp
クラスは、===
正規表現マッチングを実行するメソッドを定義します。したがって、独自のオブジェクトwhen
を定義する限り、節で独自のオブジェクトを使用できます===
。
Moddable = Struct.new(:n) do
def ===(numeric)
numeric % n == 0
end
end
mod4 = Moddable.new(4)
mod3 = Moddable.new(3)
12.times do |i|
case i
when mod4
puts "#{i} is a multiple of 4!"
when mod3
puts "#{i} is a multiple of 3!"
end
end
#=> 0 is a multiple of 4!
#=> 3 is a multiple of 3!
#=> 4 is a multiple of 4!
#=> 6 is a multiple of 3!
#=> 8 is a multiple of 4!
#=> 9 is a multiple of 3!