gpt4 book ai didi

Ruby define_method 问题

转载 作者:数据小太阳 更新时间:2023-10-29 07:51:19 25 4
gpt4 key购买 nike

我正在阅读 Ruby 中的元编程。

这是书中的两个代码片段:

my_var = "Success"

MyClass = Class.new do
puts "#{my_var} in the class definition!"
define_method :my_method do
puts "#{my_var} in the method!"
end
end

MyClass.new.my_method

⇒ Success in the class definition!
Success in the method!

和:

def define_methods
shared = 0

Kernel.send :define_method, :counter do
shared
end

Kernel.send :define_method, :inc do |x|
shared += x
end
end

define_methods

counter # => 0
inc(4)
counter # => 4

我想知道为什么在第一个示例中定义方法时不必使用动态调度(使用 Kernel.send),而在第二个示例中必须使用它。

我给了它一些想法,但无法理解它。

谢谢!

最佳答案

Module#define_method 是私有(private)的。私有(private)方法只能在没有接收者的情况下调用。因此,在第二个示例中,您需要使用反射(即 send)来规避访问限制。

请注意,第一个示例仍然 使用动态调度。事实上,在 Ruby 中,一切(变量访问和一些内置运算符除外)都使用动态调度。

关于Ruby define_method 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3370011/

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