Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 我们可以定义alias_的方法吗!方法名称_Ruby - Fatal编程技术网

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