ruby - रूबी-लेक्शिकल गुंजाइश बनाम विरासत




inheritance lexical-scope (3)

आप module Something की प्रत्येक उपस्थिति के बारे में सोच सकते हैं module Something , class Something या किसी नए दायरे में "गेटवे" के रूप में def something । जब रूबी किसी नाम की परिभाषा की खोज कर रही है जिसे संदर्भित किया गया है, तो पहले यह वर्तमान दायरे (विधि, कक्षा या मॉड्यूल) में दिखता है, और यदि यह नहीं मिलता है तो यह प्रत्येक "गेटवे" और खोज के माध्यम से वापस जाएगा वहां गुंजाइश

आपके उदाहरण में विधि baz को परिभाषित किया गया है

module Foo
  class Bar
    def baz
      puts FOO
    end
  end
end

तो जब FOO के मूल्य को निर्धारित करने की कोशिश की जाती है, तो पहले कक्षा Bar की जांच की जाती है, और चूंकि Bar में कोई FOO नहीं होता है, इसलिए खोज " class Bar गेटवे" के माध्यम से Foo मॉड्यूल में होती है जो कि युक्त क्षेत्र है। Foo में निरंतर FOO (555) होता है, इसलिए यह परिणाम आप देखते हैं।

विधि glorf को इस प्रकार परिभाषित किया गया है:

class Foo::Bar
  def glorf
    puts FOO
  end
end

यहां "गेटवे" class Foo::Bar , इसलिए जब Bar के अंदर FOO नहीं मिलता है तो "गेटवे" Foo मॉड्यूल के माध्यम से गुजरता है और सीधे शीर्ष स्तर पर जाता है, जहां एक और FOO (123) होता है जो प्रदर्शित होता है ।

ध्यान दें कि class Foo::Bar का उपयोग कैसे एक एकल "गेटवे" बनाता है, जो Foo के दायरे पर छोड़ देता है, लेकिन module Foo; class Bar ... module Foo; class Bar ... दो अलग "प्रवेश द्वार" खोलता है

यह एक मूल एसओ प्रश्न जारी है: रुबी नेमस्पेसिंग के लिए "मॉड्यूल ..." के बजाय "::" का उपयोग करना

मूल SO प्रश्न में, यहां प्रस्तुत परिदृश्य है जिसे मुझे अभी भी समझ में समस्या आ रही है:

FOO = 123

module Foo
  FOO = 555
end

module Foo
  class Bar
    def baz
      puts FOO
    end
  end
end

class Foo::Bar
  def glorf
    puts FOO
  end
end

puts Foo::Bar.new.baz    # -> 555
puts Foo::Bar.new.glorf  # -> 123

क्या कोई इस बारे में कुछ स्पष्टीकरण प्रदान कर सकता है कि पहला कॉल 555 क्यों लौट रहा है और दूसरी कॉल 123 क्यों लौट रही है?


ग्लोर्फ कक्षा फू का एक तरीका है, => [Foo, Module, Object, Kernel, BasicObject]

उस दायरे में (यानी डिफ़ॉल्ट / मुख्य मॉड्यूल में), फूड 123 को सौंपा गया है

मॉड्यूल फू को परिभाषित किया गया है

module Foo
  FOO = 555
  class Bar
    def baz
      puts FOO
    end
  end
end

जहां विधि बाज़ मॉड्यूल में कक्षा बार से संबंधित है Foo => [Bar, Foo, Object, Kernel, BasicObject]

और उस दायरे में फू को 555 सौंपा गया था


वाह, महान सवाल। सबसे अच्छा जवाब मैं साथ आ सकता हूं इस मामले में आप नामस्थान को परिभाषित करने के लिए मॉड्यूल का उपयोग कर रहे हैं।

इसकी जांच करें:

FOO = 123

module Foo
  FOO = 555
end

module Foo
  class Bar
    def baz
      puts FOO
    end

    def glorf3
      puts ::FOO
    end
  end
end

class Foo::Bar
  def glorf2
    puts Foo::FOO
  end

  def glorf
    puts FOO
  end
end

puts Foo::Bar.new.baz    # -> 555
puts Foo::Bar.new.glorf  # -> 123
puts Foo::Bar.new.glorf2  # -> 555
puts Foo::Bar.new.glorf3  # -> 123

तो मेरा विचार यह है कि जब आप परिभाषित करते हैं:

module Foo
  FOO = 555
end

आप Foo के नामस्थान में FOO बना रहे हैं। तो जब आप इसे यहां इस्तेमाल करते हैं:

module Foo
  class Bar
    def baz
      puts FOO
    end
  end
end

आप Foo नेमस्पेस में हैं। हालांकि, जब आप इसे संदर्भित करते हैं:

class Foo::Bar
  def glorf
    puts FOO
  end
end

FOO डिफ़ॉल्ट नामस्थान से आ रहा है (जैसा कि ::FOO द्वारा दिखाया गया है)।





lexical-scope