3

我有点困惑为什么以下代码实际上有效:

String.instance_eval do # self is set to String
  [:readlink, :symlink?, :expand_path].each do |method| # self is still String
    define_method(method) do # self is still String
      File.send(method, self) # what exactly is this self?
    end
  end
end
"asdf".expand_path # => "C:/users/some_user/asdf"

我不明白为什么最后一行会这样工作。定义每个方法时,方法的主体不等于File.send(method, String)?上述块实际上都没有改变self。唯一更改的行selfString.instance_eval并且它更改selfString

4

1 回答 1

5
File.send(method, self)

self将在调用动态生成的方法时进行评估。此时它将被设置为 String 的一个实例。(在您的示例中为“asdf”)。

它实际上相当于打开String类并手动编写所有这些方法。

class String
  def readlink
    File.send :readlink, self
  end

  def expand_path
    File.send :expand_path, self
  end
end
于 2012-10-23T18:40:22.633 回答