为什么使用 '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
这是一个代码示例:
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