मैं रूबी (2.4.1p111) और लोड विधि के साथ प्रयोग कर रहा हूं और इसमें कुछ अजीब व्यवहार है:

मेरे पास दो फाइलें हैं:

mytest.rb:

class MyClass

  def self.greet(param)
   puts "Got called: #{param}"
  end

  greet 'Called locally'

  load "./testld.rb"
end

और लोड की गई फ़ाइल:

testld.rb:

greet 'Called by load'

मैं प्रलेखन से समझ गया कि testld.rb से लोड किया गया कोड और MyClass में विधि कॉल को समान व्यवहार करना चाहिए। इसके बजाय, मुझे मिल रहा है:

-bash-4.2$ ruby mytest.rb
Got called: Called locally
/Blacksmith/RB/testld.rb:1:in `<top (required)>': undefined method `greet' 
for main:Object (NoMethodError)
    from mytest.rb:9:in `load'
    from mytest.rb:9:in `<class:MyClass>'
    from mytest.rb:1:in `<main>'

कोई विचार मैं क्या गलत करता हूँ?

0
Pavel 9 अगस्त 2017, 17:18

2 जवाब

सबसे बढ़िया उत्तर

आपको MyClass.greet को testld.rb में कॉल करने की आवश्यकता है, ऐसा इसलिए है क्योंकि greet कक्षा MyClass में परिभाषित एक वर्ग विधि है।

यहां< /a> वर्ग विधियों के लिए प्रलेखन है।

2
MatayoshiMariano 9 अगस्त 2017, 17:27

जहाँ भी आप कोई फ़ाइल लोड करते हैं, लोड की गई फ़ाइल का मूल्यांकन हमेशा मुख्य परिवेश में किया जाता है। testld.rb के मुख्य वातावरण में self का मान संपूर्ण स्क्रिप्ट का मुख्य वातावरण है। इसलिए, आपका

greet 'Called by load'

के बराबर नहीं है

MyClass.greet 'Called by load'

जैसा कि आपने उम्मीद की थी।

1
sawa 9 अगस्त 2017, 17:43