我得到了一个带有一些谓词方法的类(来自经典动物王国的例子)。
class Bird < Animal
include Flying
...
end
module Flying
...
def can_fly?
true
end
...
end
不幸的是,我们将此谓词称为
method_name = 'can_fly?'
animal.send "#{method_name}".to_sym
到目前为止一直运作良好。
但是......
现在我们需要调用!animal.can_fly?
[metaprograming]我们可以在Flying模块中定义method_missing
添加non_
方法,但问题是将来如果我们在其他模块中添加另一个method_missing
(游泳,挖洞)等等)会有冲突(其他模块会覆盖method_missing)。
所以我们接受了最原始的决定,添加
def cant_fly?
!can_fly?
end
是否有一些alias_method或其他机制能够为non_
方法添加别名?喜欢(以下不是有效的红宝石代码)......
alias_method :cannot_fly?, :!can_fly
答案 0 :(得分:2)
毕竟,在method_missing
课程中覆盖Animal
并不是一个非常糟糕的主意。您可以按如下方式执行此操作:
class Animal
# ...
def method_missing(method_name, *args, &block)
match = method_name.match(/^cant_(\w*)\?$/)
if match
!send("can_#{match[1]}?", *args, &block)
else
super
end
end
end