0

我刚刚开始使用 Ruby,并且遇到了我无法解释的非常奇怪的方法行为。例如:

class String
  def substitute
    gsub("a", "b")
  end
end

puts "aa".substitute # outputs: "bb"

怎么会这样?我没有将任何参数传递给“替代”方法,它如何知道要在哪个字符串上调用该gsub方法?gsub在可以省略的方法之前是否有一些不可见的属性?

在我看来,这是一种“通常”的方法应该如何工作。它得到一个参数并对该数据进行操作。(但是,在前面的示例中,没有gsub可以操作的数据?)

def substitute(arg)
  arg.gsub("a", "b")
end
4

2 回答 2

6
class String
  def substitute
    gsub("a", "b")
  end
end

是相同的

class String
  def substitute
    self.gsub("a", "b")
  end
end

这意味着gsub在您的情况下是“aa”的 String 实例上调用。

于 2013-07-03T10:15:16.883 回答
-1

在你的例子中

puts "aa".substitute # outputs: "bb"

"aa" 对象是String类的一个实例。对象知道它们的内容或数据以及它们的类。

因为"aa"对象知道它是一个字符串,所以你可以调用它的方法#substitute,它是在 String 中定义的。

因为"aa"对象知道它的内容或数据,#substitute所以不需要参数来修改这些数据。

于 2013-07-03T10:57:24.373 回答