以下是代码示例:
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
访问。有没有特定的用例?
答案 0 :(得分:3)
instance_eval
非常有用,比如在实例初始化或内部框架中定义方法时。
为什么要用它?在这些情况下,通常比调用define_method
更快,如果同时添加一堆方法,则只会使方法缓存失效一次。
在您的具体示例中,该方法仅在b
实例上创建,使其成为所谓的singleton method
,这意味着它仅存在于此特定实例中。作者本可以使用eval
,但由于它在更全局的范围内评估代码,因此被认为是不安全的。
编辑:
如果使用b
作为接收器
def b.book_name
end
答案 1 :(得分:0)
此代码的作者希望book_name
成为仅属于b
的方法。如果他在类定义中创建了它,它将属于类Book
的每个对象。