Ruby 语法错误,实例_eval字符串中意外出现| |
我想在Ruby 语法错误,实例_eval字符串中意外出现| |,ruby,Ruby,我想在实例\u eval字符串中插入一个值。参数alias\u name有时可以是nil或字符串。如果为nil,则调用另一个返回字符串的方法,如下所示: def create_document(klass, alias_name) klass.instance_eval <<-EOS def alias_name #{alias_name} || name end EOS end 我正在仔细研究这段代码,没有看到语法错误。如果{ali
实例\u eval
字符串中插入一个值。参数alias\u name
有时可以是nil或字符串。如果为nil,则调用另一个返回字符串的方法,如下所示:
def create_document(klass, alias_name)
klass.instance_eval <<-EOS
def alias_name
#{alias_name} || name
end
EOS
end
我正在仔细研究这段代码,没有看到语法错误。如果{alias\u name}
返回nil或string,为什么会导致错误
所有这些工作完成后:
> nil || 'something else'
=> "something else"
> 'something' || 'something else'
=> "something"
当alias\u name
为nil时,根本不会对其求值。它就像在instance_eval字符串中不存在一样,导致语法错误。但即使这样也不行:
alias_name = alias_name || ""
klass.instance_eval <<-EOS
def alias_name
if #{alias_name}.present?
#{alias_name}
else
demodulized_name
end
end
EOS
你看到了吗?它好像不存在别名。使用字符串插值时,
“s{expr}s”
相当于:
's ' + expr.to_s + ' s'
而nil.to_s
是一个空字符串,因此:
klass.instance_eval <<-EOS
def alias_name
#{alias_name} || name
end
EOS
当alias\u name
为nil
或空字符串且:
def alias_name
|| name
end
是语法不正确的Ruby代码
你输入到klass.instance_eval的herdoc并不知道有任何特殊的“这是Ruby代码”上下文,它只是像其他任何字符串一样构建一个字符串,并在{}
插值上盲目地调用
也许您想使用inspect
而不是来检查
:
klass.instance_eval <<-EOS
def alias_name
#{alias_name.inspect} || name
end
EOS
当alias\u name
为nil
且:
def alias_name
"pancakes" || name
end
当alias\u name
是字符串'pancakes'
时
或者,如果别名_name
是另一个方法的名称,您可能希望在实例_eval
之外进行测试:
if alias_name.present?
klass.instance_eval <<-EOS
def alias_name
#{alias_name} || name
end
EOS
else
klass.instance_eval <<-EOS
def alias_name
name
end
EOS
end
如果别名_name.present?
klass.instance_eval正是这样的问题使得eval
成为一个棘手且可能非常危险的工具。只要有可能,尝试使用define\u方法
system和类似send(别名)
的方法来实现这一点。有趣的是,直到现在,我才真正理解to\u s和inspect的区别。
klass.instance_eval <<-EOS
def alias_name
#{alias_name.inspect} || name
end
EOS
def alias_name
nil || name
end
def alias_name
"pancakes" || name
end
if alias_name.present?
klass.instance_eval <<-EOS
def alias_name
#{alias_name} || name
end
EOS
else
klass.instance_eval <<-EOS
def alias_name
name
end
EOS
end