【发布时间】:2012-10-13 18:30:36
【问题描述】:
我有点困惑为什么下面这段代码真的有效:
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。唯一更改self 的行是String.instance_eval,它将self 更改为String。
【问题讨论】:
标签: ruby metaprogramming monkeypatching