使无效的方法名有效

时间:2014-11-25 16:55:46

标签: ruby

我记得在观看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

如何才能允许我的动态方法创建,但允许用户输入他们想要的任何输入?

2 个答案:

答案 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...])