gpt4 book ai didi

Ruby 元编程 : instance_eval and class_eval

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:56 29 4
gpt4 key购买 nike

虽然我已经使用了一段时间,但我似乎对这两种方法感到困惑,我无法理解为什么方法 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,然后它似乎也起作用了!
  • 我对 instance_eval block 的理解: block 中的代码运行时将 self 设置为调用 instance_eval 的对象。<
  • 我对class_eval block 的理解: block 中的代码被评估,就好像它是通过打开调用它的对象的类来放置的一样。因此,我对上述案例中的 class_eval 感到困惑!我原以为 Bus 上的 class_eval 意味着评估 Bus Classclass 中的 block 。

最佳答案

可以引用this关于类和 instance_eval 的精彩文章,关于为什么 passengers 没有被添加到对象。

长话短说:

Bus.class_eval 将创建实例方法,Bus.instance_eval将创建类方法。

现在,关于 destination 的行为(可以在实例上调用)......class_eval 中使用时定义方法>instance_eval 不受通常行为的影响。为什么?

因为文档是这么说的。根据文档:

define method - Defines an instance method in the receiver.

因此,无论您是在 class_eval 还是 instance_eval 中使用 define_method,它都会创建一个实例方法。

Source for reference.

希望这对您有所帮助 :-)。

关于Ruby 元编程 : instance_eval and class_eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391341/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com