为什么我们在Ruby中有隐式接收器?

ali*_*922 2 ruby oop

我有两个关于Ruby核心OOP概念的问题.

  1. 我理解方法的显式调用(即self)和隐式调用(即没有初始化类对象或实例方法中的self)之间的区别.当我们有明确的接收器做一个非常整洁和明确的工作接收一个自我的方法(因为它引用当前的对象)而不是隐含的(我认为在诸如何时使用相同名称的方法或变量的情况下非常不确定初始化),那为什么我们仍然需要隐式调用方法?它只是一种偏好,还是因为正确使用私人和公共方法而必要?

  2. 通常,OOP私有方法绑定在类本身中,不能在子类或外部访问.但是,那些需要私有但又需要在子类中访问的方法然后在那里使用受保护的方法.但是在Ruby中,私有和受保护的方法都是在继承的类中访问的,唯一的区别是私有方法只能被隐式调用,受保护的方法可以隐式或显式调用.我不明白这里的哲学只是因为ruby中的隐式调用功能,私有方法的一般定义有所不同?

Ste*_*zyn 6

我认为你对受保护方法的目的有一点误解.可以从同一个类的另一个实例的方法调用受保护的方法.

class Person

  def initialize(name, age)
    @name = name
    @age = age
  end

  def older_than?(other_person)
    age > other_person.age
  end

  protected

  def age
    @age
  end

end

mother = Person.new('Carole', 34)
father = Person.new('George', 37)
Run Code Online (Sandbox Code Playgroud)

如果你试试...

mother.age
=>NoMethodError: protected method `age' called for #<Person:0x0000000327daa0 @name="Carole", @age=34>
Run Code Online (Sandbox Code Playgroud)

因此,您无法在外部调用该#age方法.

但你可以......

father.older_than?(mother)
=> true
Run Code Online (Sandbox Code Playgroud)

因此,father对象能够调用motherobject #age方法,因为他是同一个类的对象Person.