Ruby 为什么要使用';实例评估';而不是创建一个方法?
下面是一个代码示例:Ruby 为什么要使用';实例评估';而不是创建一个方法?,ruby,instance-eval,Ruby,Instance Eval,下面是一个代码示例: class Book def initialize @v = "abc" end end b = Book.new b.instance_eval do def book_name end end 为什么我们使用instance\u eval来创建一个方法(book\u name),而不是在类book中添加book\u name方法?在上述情况下,使用instance\u eval创建的方法(book\u name)只能由对象b访问。是否有任何特
class Book
def initialize
@v = "abc"
end
end
b = Book.new
b.instance_eval do
def book_name
end
end
为什么我们使用
instance\u eval
来创建一个方法(book\u name
),而不是在类book
中添加book\u name
方法?在上述情况下,使用instance\u eval
创建的方法(book\u name
)只能由对象b
访问。是否有任何特定的用例?本代码的作者希望书的名称
是一种只属于b
的方法。如果他在类定义内部创建了,它将属于类Book
的每个对象。该代码的作者希望Book\u name
是一个只属于b
的方法。如果他是在类定义内部创建的,那么它将属于类的每个对象Book
instance\u eval
在需要某种元编程时非常有用,比如在实例初始化期间或在框架内定义方法时
为什么要用它?在这些情况下,它通常比调用define_method
要快,如果同时添加一组方法,则只会使方法缓存失效一次
在您的特定示例中,该方法仅在b
实例上创建,使其成为所谓的单例方法
,这意味着它仅存在于该特定实例中。作者本可以使用eval
,但由于它在更全局的范围内评估代码,因此被认为是不安全的
编辑:
如果使用b
作为接收器定义方法,则会产生相同的效果
def b.book_name
end
instance\u eval
在需要某种元编程时非常有用,例如在实例初始化期间或在框架内定义方法时
为什么要用它?在这些情况下,它通常比调用define_method
要快,如果同时添加一组方法,则只会使方法缓存失效一次
在您的特定示例中,该方法仅在b
实例上创建,使其成为所谓的单例方法
,这意味着它仅存在于该特定实例中。作者本可以使用eval
,但由于它在更全局的范围内评估代码,因此被认为是不安全的
编辑:
如果使用b
作为接收器定义方法,则会产生相同的效果
def b.book_name
end
这是我们使用instance_evalThis的唯一原因,前面已经提到过。“在上述情况下,使用instance_eval创建的方法(书籍名称)只能由对象b访问”@JagdeepSingh:我看到这个问题已经被编辑过了。@Rohankhavi:不,
instance_eval
还有其他几种用途,例如从外部访问对象的实例变量。此外,向对象添加方法也可以通过不同的方式来实现。@JagdeepSingh在本例中,define\u singleton\u method
将是实现相同结果的更惯用的方式。我们使用instance\u evalThis的唯一原因已经在讨论中提到。“在上述情况下,使用instance_eval创建的方法(书籍名称)只能由对象b访问”@JagdeepSingh:我看到这个问题已经被编辑过了。@Rohankhavi:不,instance_eval
还有其他几种用途,例如从外部访问对象的实例变量。此外,向对象添加方法也可以通过不同的方式实现。@JagdeepSingh在这种情况下,define\u singleton\u method
将是一种更惯用的方式来实现相同的结果。请编辑以将classbook
更改为classbook
。请编辑以将classbook
更改为classbook
。