我刚刚开始使用Ruby,我遇到了一种我无法解释的非常奇怪的方法行为。例如:
class String
def substitute
gsub("a", "b")
end
end
puts "aa".substitute # outputs: "bb"
这怎么可能?我没有向'substitute'方法传递任何参数,它如何知道调用gsub
方法的字符串?在gsub
方法之前是否有一些不可见的属性可以省略?
在我看来,这是“常用”方法应该如何运作的。它得到了一个参数并对该数据进行操作。 (但是,在前面的示例中,没有gsub
可以操作的数据?)
def substitute(arg)
arg.gsub("a", "b")
end
答案 0 :(得分:6)
class String
def substitute
gsub("a", "b")
end
end
与
相同class String
def substitute
self.gsub("a", "b")
end
end
这意味着在String实例上调用gsub
,在你的情况下是“aa”。
答案 1 :(得分:-1)
在你的例子中
puts "aa".substitute # outputs: "bb"
"aa"
对象是类字符串的一个实例。对象知道他们的内容或数据及其类别。
因为"aa"
对象知道它是一个String,所以可以在其上调用方法#substitute
,该方法在String中定义。
因为"aa"
对象知道它的内容或数据,#substitute
不需要参数来修改这些数据。