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

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

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

从技术上讲,我正在寻找一个正则表达式:

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

您可以利用Symbol#inspect在名称不是有效标识符时引用该名称的事实。 有效的符号变成":hello!" 检查时,无效的一个变为":\"invalid!?\"" 。 它处理外来符号,如:foo= :[]= ,以及任何其他有效的方法名称。

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

 class Symbol def method_name? return /[@$"]/ !~ inspect end end 

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

无论哪种方式,您都应该在尝试调用方法之前检查对象是否响应方法,无论该字符串是否为合法方法名称。 您可以使用Object#respond_to?来完成此操作Object#respond_to? 方法。

例如:

 obj = Person.new method = "set_name" if obj.respond_to?(method) obj.send(method, "foo") end 

如果你想确保一个字符串是一个合法的方法名称,你想要使用正则表达式。像/^([a-zA-Z_]+|\[\])[\?!=]?$/应该适用于一般方法。 无论我的观点仍然代表确保此对象响应方法名称

源代码中允许的Ruby方法标识符可以通过以下方式匹配:

 # Yes, upper-case first letters are legal /\A(?:[a-z_]\w*[?!=]?|\[\]=?|<<|>>|\*\*|[!~+\*\/%&^|-]|[<>]=?|<=>|={2,3}|![=~]|=~)\z/i 

但请注意,可能会定义与此模式不匹配的方法:

 class Foo define_method("!dumb~name"){ puts "yup" } end Foo.new.send('!dumb~name') #=> yup 

编辑 :已更新以添加所有运算符表达式 。

我不太确定regexp是去这里的方法,但这是一个尝试

 def could_be_method_name?(m) match = /^([a-zA-Z_]([\w]*[\w!?=]$){0,1})/.match(m) return match == nil ? false : match[1].length==m.length end 

Ruby方法名称必须以字母或下划线开头。 它们只能包含字母数字字符,但最后一个字符也可以是!,?或=。