我们可以定义!method_name的alias_method

时间:2015-01-21 11:50:46

标签: ruby

我得到了一个带有一些谓词方法的类(来自经典动物王国的例子)。

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

1 个答案:

答案 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