【问题标题】:How does ruby internally call any method?ruby 如何在内部调用任何方法?
【发布时间】:2014-12-15 09:36:59
【问题描述】:

在下面的程序中,子类的方法调用了父类的私有方法。

class Parent  
  private
    def new_name
      'Private Method'
    end
end


class Child < Parent
  def get_parent_name
    puts new_name
  end
end

obj = Child.new
obj.get_parent_name

据说Ruby是面向对象的语言所以行

puts new_name

访问父类的私有方法。在内部,它如何调用方法?作为面向对象的编程语言,它应该使用对象来调用它。但是对象不能访问私有方法。

【问题讨论】:

  • 什么是基于 OOPS 的语言?
  • 面向对象的编程语言
  • 什么是“S”? ............“基于面向对象的编程语言”不是一个奇怪的短语吗?
  • 是的,很抱歉这个错误。我已经更正了。

标签: ruby oop private


【解决方案1】:

Ruby 使用 send 来调用方法。您可以自己完成并访问任何私有方法:

puts obj.send(:new_name)

Here is the doc

【讨论】:

    【解决方案2】:

    在 Ruby 中,您可以将接收者设为隐式,在这种情况下,它隐含为 self。这类似于 Self、Java、C#、Scala 和许多其他面向对象的语言,而与 Smalltalk 不同的是,Smalltalk 总是需要显式的接收器。

    另外,您似乎完全理解如何调用从Kernel 继承的私有puts 方法,但是putsnew_name 之间没有区别,那么您为什么遇到问题一个而不是另一个?

    【讨论】:

      【解决方案3】:

      回答你对第一个答案的评论。

      类中存在对当前实例的隐式引用。当您在 get_parent_name 中执行 puts new_name 时,您真正要做的是在当前实例上调用 new_name

      事实上,当您说private 时,Ruby 所做的就是避免使用显式对象引用来调用该方法。

      class Klass  
        private
      
        def new_name
          'Private Method'
        end
      
        def new_name_pub__wrong
            self.new_name  # won't work since using an explicit object reference
        end
      
        def new_name_pub__ok
            new_name  # will work but means basically the same as self.new_name
        end
      end
      

      那么在你的情况下,这只是基本的 OOP

      在实例上调用new_name 的子类(如上所述),找不到它会爬取继承层次结构并找到父类new_name(私有方法对所有子类都是可见的)

      【讨论】:

      • 那么意思是说隐式接收者不同,而同一范围内的self 不同?
      【解决方案4】:

      Ruby 中的私有方法是继承的。因此,如果您为Parent 定义私有方法,它也会出现在Child 中。

      【讨论】:

      • 是的,我知道这一点。但是如果 ruby​​ 是一种面向对象的语言,那么在内部它应该使用像 self 一样的对象来调用它。那么它在内部使用什么?
      • @user3702690:隐式接收者始终是self
      • 但是使用self这个方法是不可访问的(私有方法)。
      • @user3702690:是的,不能用显式接收器调用私有方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      相关资源
      最近更新 更多