我正在看这个例子:
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方法中为什么能用空格分隔“年龄”和等号?
答案 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文档的链接