什么是Ruby正则表达式以匹配函数名称?
我们的应用程序使用send
方法调用对象上的函数。 不幸的是,有些时候传递给send
的字符串可能不是Ruby中合法的方法名。 有没有人知道可以让我们检查这个的正则表达式?
合法的,我的意思是一个不以“?”开头的方法名称,等等。我不关心对象是否响应方法,因为在这种情况下我们使用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方法名称必须以字母或下划线开头。 它们只能包含字母数字字符,但最后一个字符也可以是!,?或=。