हां।
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
:
#call
तरह proc के पैरामीटर के रूप में obj
साथ ब्लॉक invokes। यह case
कथन में एक proc ऑब्जेक्ट को when
खंड का लक्ष्य होने की अनुमति देना है।
रूबी शुरुआत के लिए, तो रूबी के case
बयान में when
खंड खंड में मूल्य लेता है और उस पर ===
प्रणाली को बुलाती है, मामले बयान के तर्क में गुजर। तो, उदाहरण के लिए, इस कोड को ...
case "cats"
when /^cat/ then puts("line starts with cat!")
when /^dog/ then puts("line starts with dog!")
end
... अगर यह भी मिलान होने पर फैसला करने के लिए /^cat/ === "cats"
चलाता है; RegExp
कक्षा regex मिलान करने के लिए ===
विधि को परिभाषित करती है। इस प्रकार, आप 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!
मैंने सोचा कि यह पहले से था। – sawa