2010-02-19 12 views
5

क्या कोई मुझे निम्नलिखित समझने में मदद कर सकता है? आईआरबी में तोविधि घोषित की गई विधि स्वचालित रूप से कक्षा शामिल है?

class Dog 
end 
// bark is declared outside of Dog class 
def bark 
    puts 'Woof!' 
end 

:: मैं test.rb में निम्न कोड है

>> source 'test.rb' 
>> a = Dog.new 
=> #<Dog:0x117f614> 
>> a.bark 
Woof! 
=> nil 

क्यों विधि bark कुत्ता उदाहरण में मौजूद भले ही यह वर्ग के बाहर घोषित किया जाता है? क्योंकि यह एक ही फाइल में है? धन्यवाद!

उत्तर

3

जब आप "वैश्विक" दायरे में एक विधि बनाने (किसी भी वर्ग के बाहर), कि विधि वस्तु के एक निजी विधि किया जाता है कुत्ता:

dog = Dog.new 
p dog.class.name    # => "Dog" 
p dog.class.superclass.name # => "Object" 

इसलिए कुत्तों (और वास्तव में सभी वस्तुओं को) अब जानते हैं कि कैसे भौंकने के लिए। हालांकि, विधि निजी जा रहा है, आप instance_eval उपयोग का सुस्पष्ट रिसीवर से कॉल करने की करना होगा:

dog.instance_eval { bark } # => "Woof!" 

या आप कोई जिमनास्टिक के साथ एक अंतर्निहित रिसीवर की जरूरत से कॉल करने की कर सकते हैं:

bar # => "Woof!" 
+0

यह समझ में आता है, धन्यवाद !! – penger

1

आपका सटीक उदाहरण रुबी 1.9 में काम नहीं करता है। (बुरा टिप्पणी वाक्य-विन्यास के अलावा।)

हालांकि, शीर्ष स्तर के दायरे में एक विधि की घोषणा यह एक निजी विधि Object पर कर देगा, जाहिरा तौर पर:

>> Object.private_methods.include? :bark 
=> true 
शायद आपके रूबी में

, (1.8?) यह एक सार्वजनिक विधि है?

#!/usr/bin/ruby1.8 

class Dog 
end 

p Object.respond_to?(:bark, true)  # => false 

def bark 
    puts "Woof!" 
end 

p Object.respond_to?(:bark, true)  # => true 

वस्तु, सभी वस्तुओं के वंश श्रृंखला में है जिनमें शामिल हैं:

+0

यह 1.8 में सार्वजनिक नहीं है। मुझे नहीं पता कि ओपी के कोड ने शिकायत क्यों नहीं की "निजी विधि छाल कहा जाता है ..."। यह irb "स्रोत" लाइन के साथ कुछ करने के लिए है। मुझे नहीं पता कि यह "आवश्यकता" से अलग क्या करता है। –

+0

(1.8.7 में) यह सच है - अगर मुझे स्रोत के बजाय आवश्यकता है, तो मुझे वास्तव में यह त्रुटि मिलती है। स्रोत संभावित रूप से बैश बिल्टिन जैसा ही है, जिसमें फ़ाइल की सामग्री शामिल है जैसे कि इसे टाइप किया गया था - इसलिए एक निजी विधि पहुंच योग्य होगी। – Shadowfirebird

संबंधित मुद्दे