我记得在观看Dave Thomas Ruby教程时,他使用了一种技术来使无效的方法名称仍为解释器所接受。例如,即使"案例日期"是一个无效的方法名称,因为有一个空格,在教程中他的技巧允许该方法仍然有效。
不幸的是,我不记得了,但这是我的情况。我接受用户输入并将其转换为方法,如下所示:
def self.define_field(name, type)
class_eval <<-EOS
field :#{ name}, type: #{type}
EOS
end
问题是如果用户输入中有空格或方法名称的其他无效字符,我会收到以下错误:
syntax error, unexpected tIDENTIFIER, expecting end-of-input
field :damage date, type: Date
如何才能允许我的动态方法创建,但允许用户输入他们想要的任何输入?
答案 0 :(得分:1)
您可以尝试直接将name
转换为符号,而不是通过eval。
[1] pry(main)> "damage date".to_sym
=> :"damage date"
但除非你有一个真正的理由需要空间,否则我会找到另一种方式。看起来像是灾难的秘诀。
不知道Dave Thomas在谈论什么,但我想知道他是否正在讨论method_missing
?
http://www.ruby-doc.org/core-2.1.5/BasicObject.html#method-i-method_missing
答案 1 :(得分:1)
鉴于您的班级X
,您可以生成一个接受空格字符的符号:
s = input.to_sym
然后在您的类上调用define_singleton_method
以定义单例方法:
X.define_singleton_method(s) do
...
end
然后,您可以使用send
在类X
的实例x
上调用该方法:
x.send(input.to_sym [, args...])