instance_eval
传递绑定时会做什么?我很困惑在此代码:instance_eval在这种情况下如何工作?到底是怎么回事?
require 'erb'
require 'ostruct'
namespace = OpenStruct.new(name: 'Joan', last: 'Maragall')
template = 'Name: <%= name %> <%= last %>'
result = ERB.new(template).result(namespace.instance_eval { binding })
我从文档读取instance_eval
位:Z
求值包含Ruby源代码的字符串,或者给定块时,接收机的(范围内OBJ)。为了设置上下文,变量self在代码执行时被设置为obj,从而赋予代码访问obj的实例变量的权限。
因此binding
运行在接收器的上下文中,它是OpenStruct
。但那么模板如何得到name
和last
?我觉得我错过了一步。
也就是说,我很困惑,为什么出现这种情况:
result = ERB.new(template).result(namespace)
TypeError: wrong argument type OpenStruct (expected binding)
我很困惑,为什么我需要绑定。 – Jwan622
@ Jwan622你需要一个绑定,因为'ERB#result'需要一个绑定作为参数。您无法传递当前上下文的绑定(即'ERB.new(template).result(binding)'),因为'name'和'last'将不可用。你需要一个来自'namespace'的绑定。你怎样才能从其他对象获取绑定? 'obj.instance_eval {binding}'。 – Aetherus