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

Why use 'instance_eval' instead of creating a method?

这是一个代码示例:

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

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

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

此代码的作者希望 book_name 成为仅属于 b 的方法。如果他在 class 定义内创建,它将属于 class Book.

的每个对象

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

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

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

编辑:

如果你定义方法使用b作为接收者

也会产生同样的效果
def b.book_name
end