Ruby 我们可以定义alias_的方法吗!方法名称
我得到了一个带有谓词方法的类(来自经典动物王国的示例) 到目前为止,它一直运作良好 但是 现在我们需要调用Ruby 我们可以定义alias_的方法吗!方法名称,ruby,Ruby,我得到了一个带有谓词方法的类(来自经典动物王国的示例) 到目前为止,它一直运作良好 但是 现在我们需要调用!动物。你会飞吗? [元编程]我们可以在飞行模块中定义method\u missing添加non\u方法,但问题是,将来如果我们在其他模块(游泳、挖洞等)中添加另一个method\u missing,将会有冲突(其他模块将覆盖method\u missing) 因此,我们接受了最原始的决定,添加 def cant_fly? !can_fly? end 是否有一些别名方法或其
!动物。你会飞吗?
[元编程]我们可以在飞行模块中定义method\u missing
添加non\u
方法,但问题是,将来如果我们在其他模块(游泳、挖洞等)中添加另一个method\u missing
,将会有冲突(其他模块将覆盖method\u missing)
因此,我们接受了最原始的决定,添加
def cant_fly?
!can_fly?
end
是否有一些别名方法或其他机制能够为非
方法别名?类似(以下不是有效的ruby代码)
毕竟,在你的
Animal
类中重写method\u missing
似乎不是一个坏主意。您可以按如下方式执行此操作:
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
不,你不能这样做。你为什么不干脆做
!animal.send method_name
?能否显示更多元代码,因为不清楚为什么不调用!animal.send“#{method_name}”。需要求反时发送到_sym
。问题可能发生在如何表示需要调用方法的否定中,而不是在更深层次的实现中。或者,只需添加cant\u fly?
很短(它的长度与您所需的alias\u方法几乎相同),并且标准的Rubyanimal=Pengiun.new;traits=[“会游泳吗?”,“不会飞吗?”;动物有所有的特征?{| trait | animal.send(:trait)}
def cant_fly?
!can_fly?
end
alias_method :cannot_fly?, :!can_fly
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