2013-05-21 62 views

回答

19

是的。

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! 
+0

'l'在堆棧溢出上看起來非常類似於'1'。我想知道喬治奧威爾是否負責數學系一分鐘! (PS:是否有關於在case語句中使用procs的任何文檔?) –

+0

我鏈接到1.9.1文檔,但似乎所有現代版本的文檔都無法爲該方法提供適當的標題,這使得它非常容易混淆。我將用'Proc#==='的文檔編輯問題。 – Phrogz

+1

謝謝,phroggie,爲我提供了'Proc#==='。 –

相關問題