ruby सकत रूबी में एक उदाहरण से निजी वर्ग पद्धति को कॉल करने का एक तरीका है?




बिना नंबर दिखाए कर सकते हैं कॉल, स्क्रीन पर आएगा unknown नंबर (5)

self.class.send :method, args... अलावा। self.class.send :method, args... , ज़ाहिर है। मैं कोड के दोहरे बिना क्लास और इंस्टेंस लेवल दोनों पर एक जटिल जटिल विधि बनाना चाहता हूं।

अद्यतन करें:

@ जोनाथन ब्रानाम: यह मेरी धारणा थी, लेकिन मैं यह सुनिश्चित करना चाहता था कि किसी और को चारों ओर एक रास्ता नहीं मिला। रूबी में दृश्यता उस जावा से बहुत भिन्न है आप यह भी काफी सही हैं कि private तरीकों पर काम नहीं करता है, हालांकि यह एक निजी वर्ग की विधि घोषित करेगा:

class Foo
  class <<self
    private
    def bar
      puts 'bar'
    end
  end
end

Foo.bar
# => NoMethodError: private method 'bar' called for Foo:Class

यदि आपकी पद्धति केवल एक उपयोगिता फ़ंक्शन है (अर्थात यह किसी भी उदाहरण चर पर भरोसा नहीं करती है), तो आप विधि को एक मॉड्यूल में डाल सकते हैं और include कर सकते include और कक्षा extend ताकि यह एक निजी वर्ग विधि और एक निजी दोनों के रूप में उपलब्ध हो। उदाहरण विधि


जब तक मैं ग़लतफ़हमी नहीं करता हूँ, तो आपको बस ऐसा कुछ नहीं चाहिए:

class Foo
    private
    def Foo.bar
        # Complex logic goes here
        puts "hi"
    end

    public
    def bar
        Foo.bar
    end
end

बेशक आप अपनी स्वयं का उपयोग करने के लिए दूसरी परिभाषा को बदल सकते हैं। क्लास। यदि आप क्लास का नाम हार्डकोडिंग से बचना चाहते हैं तो ...


मुझे अधिक या कम अजीब समाधानों और गैर-समाधानों की सूची में योगदान देना चाहिए:

puts RUBY_VERSION # => 2.1.2

class C
  class << self
    private def foo
      'Je suis foo'
    end
  end

  private define_method :foo, &method(:foo)

  def bar
    foo
  end
end

puts C.new.bar # => Je suis foo
puts C.new.foo # => NoMethodError

आजकल आपको सहायक विधियों की ज़रूरत नहीं है। आप बस अपनी विधि परिभाषा के साथ इनलाइन कर सकते हैं। यह जावा लोगों से बहुत परिचित होना चाहिए:

class MyClass

  private_class_method def self.my_private_method
    puts "private class method"
  end

  private def my_private_method
    puts "private instance method"
  end

end

और नहीं, आप एक उदाहरण विधि से निजी वर्ग विधि को कॉल नहीं कर सकते। हालांकि, आप इसके बजाय निजी- private_constant सहायक पद्धति का उपयोग करते हुए एक निजी नेस्टेड क्लास में सार्वजनिक वर्ग विधि के रूप में निजी वर्ग पद्धति को लागू कर सकते हैं। इस ब्लॉगपोस्ट को और अधिक विस्तार से देखें।


यह "असली" निजी वर्ग के तरीकों के साथ खेलने का तरीका है

class Foo
  def self.private_bar
    # Complex logic goes here
    puts "hi"
  end
  private_class_method :private_bar
  class <<self
    private
    def another_private_bar
      puts "bar"
    end
  end
  public
  def instance_bar
    self.class.private_bar
  end
  def instance_bar2
    self.class.another_private_bar
  end
  def calling_private_method
    Foo.send :another_private_bar
    self.class.send :private_bar
  end
end
f=Foo.new
f.send :calling_private_method 
 # "bar"
 # "hi"
Foo.send :another_private_bar
# "bar"

चियर्स





access-specifier