我现在正在学习红宝石元编程,当我在玩游戏并测试时,我偶然发现了一些我无法找到答案的东西。我们假设我们有以下代码:
Main
我希望这会将一个名为class Foo
end
Foo.instance_eval do
define_method("bar") do
1
end
end
的类方法添加到bar
,但是当我调用该方法时,它会说它未定义。令我感到困惑的是,当我使用Foo
而不是def
时,相同的代码才有效。当我尝试使用define_method
定义实例方法时,两种方式似乎都有效。那么这里到底发生了什么?
提前致谢。
答案 0 :(得分:1)
让我们简单一点。
define_method
是一种方法。或者我应该说一个Object类的私有类方法。您可以通过给它一个参数作为您要定义的实例方法名称来调用它,以及一个包含该方法代码的块。 apidock有非常明确的定义。您可能想阅读文档。
def
是一个关键字。您可以像往常一样使用它来定义方法。与元编程没有多大关系。
如果您正在尝试定义类方法,请使用class_eval,并为其指定字符串。正如其名称所示,instance_eval
定义了实例级别的内容。在您的代码中,如果您执行Foo.instance_methods
,则会找到bar
方法。因此,如果您Foo.new.bar
,它会返回1
,因为TK-421会回答您。但是由于define_method
定义了instance_method,如文档所示,无论你使用class_eval还是instance_eval,你都会获得实例方法。
以下是您可以阅读的文件,他们会回答您的所有问题。
class_eval:http://apidock.com/ruby/v1_9_3_392/Module/class_eval
define_method:http://apidock.com/ruby/Module/define_method
instance_eval:http://apidock.com/ruby/Object/instance_eval
不要忘记这一切:http://www.google.com:D
答案 1 :(得分:0)
它是一种实例方法。所以:
f = Foo.new
f.bar # 1
答案 2 :(得分:0)
def和define_method之间的差异。
1:-define_method可以使用定义了作用域的变量。
local_var = "Hello World"
def greet1
local_var #undefined local_var
end
define_method(:greet2) do
local_var # returns local_var
end
2:-如果要定义名称存储在变量中的方法,则必须使用define_method。您无法使用def动态声明方法。
因此,根据要求,您将必须使用def或define_method。
您的代码的解释。
在这里,您必须使用#define_singleton_method而不是#define_method来为Foo类定义类方法。 define_method将为类Foo定义实例方法
所以预期的代码应该是
class Foo
end
Foo.instance_eval do
define_singleton_method("bar") do
1
end
define_method("baz") do
2
end
end
Foo.bar #=> 1
Foo.new.baz #=> 2