2012-03-12 20 views
6

This article रूबी 1.9 में प्रोसेस करने के 4 तरीके बताते हैं, और === उनमें से एक है। मुझे समझ में नहीं आता कि यह इस तरह से क्यों किया जाएगा। क्या इसका सामान्य अर्थ === के सामान्य संबंध है (पूछना कि क्या दो वस्तुएं एक ही वस्तु हैं)?रूबी 1.9 में === के साथ प्रोसेस क्यों लगाए जा सकते हैं?

 
irb(main):010:0> f =-> n {[:hello, n]} 
=> # 
irb(main):011:0> f.call(:hello) 
=> [:hello, :hello] 
irb(main):012:0> f === :hello 
=> [:hello, :hello] 
irb(main):013:0> Object.new === Object.new 
=> false 
irb(main):014:0> f === f 
=> [:hello, #] 

उत्तर

4

This is what the docs have to say:

यह एक proc वस्तु मामले बयान में when खंड का लक्ष्य होना करने के लिए अनुमति देने के लिए है।

यह एक, शायद काल्पनिक, उदाहरण है:

even = proc { |x| x % 2 == 0 } 
n = 3 
case n 
when even 
    puts "even!" 
else 
    puts "odd!" 
end 

यह काम करता है क्योंकि case/when मूल रूप से इस तरह क्रियान्वित किया जाता है: === फोन करके

if even === n 
    puts "even!" 
else 
    puts "odd!" 
end 

case/when चेकों जो शाखा निष्पादित करने के लिए when खंडों के तर्कों पर, पहला सिक्योरिटी मान देता है जो सच्चाई देता है।

समानता ऑपरेटर (==) की समानता के बावजूद यह एक मजबूत या कमजोर रूप नहीं है। मैं === ऑपरेटर के बारे में सोचने की कोशिश करता हूं "ऑपरेटर" से संबंधित है। Class इसे परिभाषित करता है ताकि आप यह जांच सकें कि कोई ऑब्जेक्ट वर्ग (यानी वर्ग का एक उदाहरण या वर्ग का सबक्लास है) Range यह जांचने के लिए परिभाषित करता है कि श्रेणी (यानी सीमा में शामिल है), और इसी तरह। यह वास्तव में Proc केस अधिक समझ में नहीं आता है, लेकिन इसके बारे में सोचें कि ऑपरेटरों से संबंधित है, जैसा कि ऊपर मेरा उदाहरण है; मैंने एक ऑब्जेक्ट परिभाषित किया है जो निर्धारित कर सकता है कि से भी संख्याओं का सेट है या नहीं।

+0

ओह लंबाई माणिक क्रम में चला जाता है जो अच्छा मामले/जब ब्लॉक के लिए :-) 'स्ट्रिंग ===" foo "=> true' –

5

ध्यान दें कि रूबी में === जावास्क्रिप्ट के विपरीत समानता के बारे में नहीं है। यह विशेष रूप से for case expressions प्रयोग किया जाता है:

case cats.length 
    when 42       # Uses 42  === cats.length 
    puts :uh 
    when /cool/i     # Uses /cool/i === cats.length 
    puts :oh 
    when ->(n){ n.odd? || n/3==6 } # Passes cats.length to the proc 
    puts :my 
end 
+0

कूल, लेकिन _odd_। – user2398029

+0

@louism किसी भी मामले में रेगेक्स का उपयोग करने से अधिक अजीब, आईएमओ (संख्यात्मक # grep के बराबर) या उपयोग करने से 'संख्यात्मक # चयन' के लिए एक ब्लॉक। – Phrogz

2

यह सुविधा मामले निर्माण में उपयोगी है, जब आप की तुलना में कुछ गणना करनी है।

is_odd =-> n { n%2 != 0 } 
is_even =-> n { n%2 == 0 } 

case 5 
when is_even 
    puts "the number is even" 
when is_odd 
    puts "the number is odd" 
end 

=> the number is odd 
+0

हम्म ... मैंने @ संपादित करने से पहले अपना संपादन किया था ... जीएमटीए –

+0

@ जॉन बचिर, मुझे नहीं लगता कि आपका संपादन विचार का वर्णन करने के लिए अच्छा है निर्माण के मामले में लैम्ब्डा का – megas

0

यह === के सामान्य अर्थ के किसी भी रिश्ते है (पूछेगा कि क्या दो वस्तुओं एक ही वस्तु हैं)?

वास्तव में, रूबी में === के बारे में यह एक आम गलतफहमी है। यह वास्तव में Object#object_id तुलना के लिए सख्ती से नहीं है (हालांकि यह कई आम आमंत्रणों में इसका व्यवहार है)। रुबी में, === केस subsumption है। # == बुला के रूप में वर्ग वस्तु के लिए, प्रभावी रूप से एक ही , लेकिन आम तौर वंश द्वारा ओवरराइड मामले बयान में सार्थक अर्थ विज्ञान प्रदान करने के लिए - "मामला समानता:

यहाँ ===Object से की विवरण दिया गया है।"

दुख की बात है, भले ही वह तीन = के शामिल है, यह कुछ भी समानता के साथ क्या करना नहीं है यहां तक ​​कि दूर से :-D