Ruby 为什么要使用';实例评估';而不是创建一个方法?

Ruby 为什么要使用';实例评估';而不是创建一个方法?,ruby,instance-eval,Ruby,Instance Eval,下面是一个代码示例: class Book def initialize @v = "abc" end end b = Book.new b.instance_eval do def book_name end end 为什么我们使用instance\u eval来创建一个方法(book\u name),而不是在类book中添加book\u name方法?在上述情况下,使用instance\u eval创建的方法(book\u name)只能由对象b访问。是否有任何特

下面是一个代码示例:

class Book
  def initialize
    @v = "abc"
  end
end

b = Book.new
b.instance_eval do
  def book_name
  end
end

为什么我们使用
instance\u eval
来创建一个方法(
book\u name
),而不是在类
book
中添加
book\u name
方法?在上述情况下,使用
instance\u eval
创建的方法(
book\u name
)只能由对象
b
访问。是否有任何特定的用例?

本代码的作者希望
书的名称
是一种只属于
b
的方法。如果他在类定义内部创建了,它将属于类
Book

的每个对象。该代码的作者希望
Book\u name
是一个只属于
b
的方法。如果他是在类定义内部创建的,那么它将属于类的每个对象
Book

instance\u eval
在需要某种元编程时非常有用,比如在实例初始化期间或在框架内定义方法时

为什么要用它?在这些情况下,它通常比调用
define_method
要快,如果同时添加一组方法,则只会使方法缓存失效一次

在您的特定示例中,该方法仅在
b
实例上创建,使其成为所谓的
单例方法
,这意味着它仅存在于该特定实例中。作者本可以使用
eval
,但由于它在更全局的范围内评估代码,因此被认为是不安全的

编辑:

如果使用
b
作为接收器定义方法,则会产生相同的效果

def b.book_name
end

instance\u eval
在需要某种元编程时非常有用,例如在实例初始化期间或在框架内定义方法时

为什么要用它?在这些情况下,它通常比调用
define_method
要快,如果同时添加一组方法,则只会使方法缓存失效一次

在您的特定示例中,该方法仅在
b
实例上创建,使其成为所谓的
单例方法
,这意味着它仅存在于该特定实例中。作者本可以使用
eval
,但由于它在更全局的范围内评估代码,因此被认为是不安全的

编辑:

如果使用
b
作为接收器定义方法,则会产生相同的效果

def b.book_name
end

这是我们使用instance_evalThis的唯一原因,前面已经提到过。“在上述情况下,使用instance_eval创建的方法(书籍名称)只能由对象b访问”@JagdeepSingh:我看到这个问题已经被编辑过了。@Rohankhavi:不,
instance_eval
还有其他几种用途,例如从外部访问对象的实例变量。此外,向对象添加方法也可以通过不同的方式来实现。@JagdeepSingh在本例中,
define\u singleton\u method
将是实现相同结果的更惯用的方式。我们使用instance\u evalThis的唯一原因已经在讨论中提到。“在上述情况下,使用instance_eval创建的方法(书籍名称)只能由对象b访问”@JagdeepSingh:我看到这个问题已经被编辑过了。@Rohankhavi:不,
instance_eval
还有其他几种用途,例如从外部访问对象的实例变量。此外,向对象添加方法也可以通过不同的方式实现。@JagdeepSingh在这种情况下,
define\u singleton\u method
将是一种更惯用的方式来实现相同的结果。请编辑以将
classbook
更改为
classbook
。请编辑以将
classbook
更改为
classbook