Меня немного смущает, почему на самом деле работает следующий фрагмент кода:
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
.