Ruby方法覆盖

时间:2013-07-03 10:11:21

标签: ruby

我刚刚开始使用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

2 个答案:

答案 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不需要参数来修改这些数据。