我想插入一個instance_eval
字符串中的值。參數alias_name
有時可以是零或字符串。如果是零,那麼我調用它返回一個字符串的另一種方法,如下圖所示:語法錯誤,意外|| in instance_eval字符串
def create_document(klass, alias_name)
klass.instance_eval <<-EOS
def alias_name
#{alias_name} || name
end
EOS
end
但是,這實際上是給了我一個語法錯誤:
Uncaught exception: (eval):2: syntax error, unexpected ||
|| name
^
我這個代碼密切關注我沒有看到語法錯誤。如果#{alias_name}
要麼返回零或字符串,爲什麼這會導致錯誤?
畢竟這所有的作品:
> nil || 'something else'
=> "something else"
> 'something' || 'something else'
=> "something"
當alias_name
是零,它不會在所有的評估。它就像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
它將給這個錯誤:
Uncaught exception: (eval):2: syntax error, unexpected '.'
if .present?
^
你看到了嗎?其彷彿alias_name
不存在。
它的問題,這樣,使'eval'一個棘手的和潛在的非常危險的工具。只要有可能,試着用'define_method'系統和'send(alias_name)'來做這件事。 – tadman