0

这是一个代码示例:

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

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

为什么我们使用instance_eval创建方法(book_name)而不是在类中添加book_name方法Book?在上述情况下,book_name使用创建的方法 ( )instance_eval只能由对象访问。b有什么特别的用例吗?

4

2 回答 2

3

instance_eval当需要某种元编程时非常有用,例如在实例初始化期间或在框架内部定义方法时。

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

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

编辑:

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

def b.book_name
end
于 2018-04-03T20:56:56.600 回答
0

这段代码的作者想book_name成为一个只属于b. 如果他在类定义中创建,它将属于 class 的每个对象Book

于 2018-04-03T05:35:51.293 回答