我記得在Ruby 2.0中允許使用case
語句的過程,但我無法谷歌它。可以使用Ruby 2.0中的case語句嗎?
我試過檢查Ruby 2.0.0 NEWS和How to write a switch statement in Ruby。我還訪問了http://ruby-doc.org,但它的關鍵字鏈接是Ruby 1.9,而不是Ruby 2.0。
在case語句中是否允許procs?
我記得在Ruby 2.0中允許使用case
語句的過程,但我無法谷歌它。可以使用Ruby 2.0中的case語句嗎?
我試過檢查Ruby 2.0.0 NEWS和How to write a switch statement in Ruby。我還訪問了http://ruby-doc.org,但它的關鍵字鏈接是Ruby 1.9,而不是Ruby 2.0。
在case語句中是否允許procs?
是的。
2.0.0p0 :001> lamb = ->(x){ x%2==1 }
#=> #<Proc:[email protected](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
然而,這與1.9.1並沒有不同,因爲當時定義了Proc#===
。由於紅寶石文檔似乎已經顯示這種方法的問題,要明確的文件說,proc === obj
:
調用與
obj
塊像#call
的PROC的參數。它允許一個proc對象成爲case
語句中的when
子句的目標。
爲Ruby初學者,那麼在Ruby的case
聲明when
條款採取子句中的值,並調用它的===
方法,傳遞參數給case語句。因此,舉例來說,這個代碼...
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!
'l'在堆棧溢出上看起來非常類似於'1'。我想知道喬治奧威爾是否負責數學系一分鐘! (PS:是否有關於在case語句中使用procs的任何文檔?) –
我鏈接到1.9.1文檔,但似乎所有現代版本的文檔都無法爲該方法提供適當的標題,這使得它非常容易混淆。我將用'Proc#==='的文檔編輯問題。 – Phrogz
謝謝,phroggie,爲我提供了'Proc#==='。 –
我以爲它來自之前。 – sawa