【发布时间】:2015-02-08 06:43:03
【问题描述】:
虽然我已经使用了一段时间,但似乎我对这两种方法感到困惑,我不明白为什么方法 passengers 没有被添加到以下代码中的对象中:
class Bus
def number_of_seats
42
end
end
Bus.class_eval do
define_method :number_of_windows do
number_of_seats
end
def fuel_type
:diesel
end
end
Bus.instance_eval do
define_method :destination do
'Paris'
end
def passengers
12
end
end
bus = Bus.new
bus.number_of_windows # => 42
bus.fuel_type # => :diesel
bus.destination # => "Paris"
bus.passengers # => undefined method `passengers' (NoMethodError)
注意事项:
- 先尝试
instance_eval,随机使用class_eval,然后好像也奏效了! - 我对@987654324@的块的理解:块中的代码运行时将
self设置为调用instance_eval的对象。 - 我对@987654327@ 块的理解:块中的代码是通过打开调用它的对象的类来评估的。因此,在上述情况下,我对
class_eval感到困惑!我期待 Bus 上的class_eval意味着评估 Bus Class 的class中的块。
【问题讨论】:
-
方法
passengers工作正常:Bus.passengers #=> 12。将Bus.instance_eval更改为Bus.class_eval以使passengers成为实例方法。 -
你也可以使用
Bus.send(:define_method, :passengers) { 12 }。 -
除了“事情如何运作”之外,这绝对是非常奇怪的行为。
标签: ruby metaprogramming