为什么使用'instance_eval'而不是创建方法?

时间:2018-04-03 05:32:02

标签: ruby instance-eval

以下是代码示例:

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访问。有没有特定的用例?

2 个答案:

答案 0 :(得分:3)

当需要某种元编程时,

instance_eval非常有用,比如在实例初始化或内部框架中定义方法时。

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

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

编辑:

如果使用b作为接收器

定义方法,则会产生相同的效果
def b.book_name
end

答案 1 :(得分:0)

此代码的作者希望book_name成为仅属于b的方法。如果他在类定义中创建了它,它将属于类Book的每个对象。