Ruby:def和define_method之间的区别

时间:2015-11-22 21:30:03

标签: ruby metaprogramming class-method

我现在正在学习红宝石元编程,当我在玩游戏并测试时,我偶然发现了一些我无法找到答案的东西。我们假设我们有以下代码:

Main

我希望这会将一个名为class Foo end Foo.instance_eval do define_method("bar") do 1 end end 的类方法添加到bar,但是当我调用该方法时,它会说它未定义。令我感到困惑的是,当我使用Foo而不是def时,相同的代码才有效。当我尝试使用define_method定义实例方法时,两种方式似乎都有效。那么这里到底发生了什么?

提前致谢。

3 个答案:

答案 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