从类调用setter方法时,为什么可以更改方法名称?

时间:2019-10-04 17:33:53

标签: ruby class

我正在看这个例子:

class Person
  attr_reader :name, :age   #creates getter method's age & name     

  def initialize(name)
    @name = name
  end
  def age=(a)               # creates setter method for age
    @age = a
  end
end
mike = Person.new('Mike') 
mike.age = 20               # calling setter method
mike.age                    # calling getter method, returns 20

我试图理解为什么“ mike.age = 20”等同于说“ mike.age =(20)”。

我了解到,对于传递给方法的参数,我们不必在Ruby中使用括号。所以我知道为什么“ mike.age = 20”与“ mike.age = 20”相同。但是,我很难理解为什么我们可以在“年龄”之后放置一个空格。等号不是方法名称的一部分吗?例如,我知道我不能说:

def is_even?(n)
   n.even?
end

p is_even ? 3

因为问号是方法名的一部分,所以我知道不能用空格分隔它。那么为什么在第一个示例中的setter方法中为什么能用空格分隔“年龄”和等号?

1 个答案:

答案 0 :(得分:1)

这是StackOverflow链接,其中“ mu太短”回答了这个问题: Ruby setter method syntax method=(value) - Comparison to Java

例如,当您添加两个数字

4 + 4

这是怎么回事

4.send(:+, 4)

send方法仅调用一个方法。第一个参数是要作为符号:+传递的方法,第二个参数是要传递给方法4的参数

以您的情况

mike.age = 20

实际上是这个

mike.send(:age=, 20)

在这里,我们正在调用age=方法并将20传递为age=的参数

此处提供了有关send方法https://ruby-doc.org/core-2.6.4/Object.html#method-i-send的Ruby文档的链接

相关问题