什么是Ruby正则表达式以匹配函数名称?

Jul*_*oux 2 ruby regex

我们的应用程序使用该send方法调用对象上的函数.不幸的是,传递给字符串的某些时候send可能不是Ru​​by中合法的方法名称.有谁知道可以让我们检查这个的正则表达式?

合法的,我的意思是一个不以"?"开头的方法名称,等等.我不关心对象是否响应方法,因为我们method_missing在这种情况下使用,我们实际上希望它被使用,这只会发生在对象没有响应的方法中.

从技术上讲,我正在寻找一个正则表达式,其做到这一点:

Ruby标识符由字母,十进制数字和下划线字符组成,并以字母(包括下划线)开头.Ruby标识符的长度没有限制.

Jos*_*Lee 15

您可以利用Symbol#inspect在名称不是有效标识符时引用名称的事实.":hello!"检查时会生成有效符号,但会生成无效符号":\"invalid!?\"".它处理奇异符号,如:foo=,:[]=和任何其他有效的方法名称.

添加@-names是有效标识符但不是有效方法名称的附加要求给出了以下含义:

class Symbol
  def method_name?
    return /[@$"]/ !~ inspect
  end
end
Run Code Online (Sandbox Code Playgroud)


Lee*_*vis 5

如果它是一个合法的方法名称,但该方法实际上并不存在于您尝试将其发送到的对象上怎么办?

无论哪种方式,您都应该在尝试调用该对象之前检查该对象是否响应了该方法,无论该字符串是否为 not 的合法方法名称。您可以通过使用该Object#respond_to?方法来做到这一点。

例如:

obj = Person.new
method = "set_name"

if obj.respond_to?(method)
  obj.send(method, "foo")
end
Run Code Online (Sandbox Code Playgroud)

如果你想确保一个字符串是一个合法的方法名称,你会想要使用正则表达式......类似的东西/^([a-zA-Z_]+|\[\])[\?!=]?$/应该适用于一般方法。不管怎样,我的观点仍然是确保这个对象响应一个方法名