Ruby 直呼祖先

Ruby 直呼祖先,ruby,Ruby,我有一个类Text,我为它预先设置了不同的模块,如大写或修剪。最后,我得到: Text.ancestors # => [Capitalize,Trim,Text,Object,Kernel] 我想调用一个更正文本的方法。通过调用返回具有前一个祖先行为的文本的方法,我希望递归地遍历每个祖先,直到到达text类,然后返回文本 我有个问题。每个模块和类都有相同的名为correct\u text的方法,我无法创建任何别名。当我通过Capitalize时,它没有问题,但是当我在Trim中递归调用一

我有一个类
Text
,我为它预先设置了不同的模块,如
大写
修剪
。最后,我得到:

Text.ancestors # => [Capitalize,Trim,Text,Object,Kernel]
我想调用一个更正文本的方法。通过调用返回具有前一个祖先行为的文本的方法,我希望递归地遍历每个祖先,直到到达
text
类,然后返回文本

我有个问题。每个模块和类都有相同的名为
correct\u text
的方法,我无法创建任何别名。当我通过
Capitalize
时,它没有问题,但是当我在
Trim
中递归调用一个方法时,我不能调用这个祖先的方法(私有方法或使用
send
),因为在
Capitalize
上有一个同名的方法,它最终会按照顺序被调用


可以对祖先调用方法吗?是否可以在不使用
undef\u方法的情况下撤消
prepend
/
include
/
extend

module Capitalize
  def correct_text
    super.capitalize
  end
end

module Trim
  def correct_text
    super.strip
  end
end

class Text
  prepend Capitalize
  prepend Trim

  def correct_text
    'hello '
  end
end

Text.new.correct_text # => "Hello"

只需在预先指定的方法中调用
super
。这不是每次都调用Text吗?不,不是。我根本不理解你的问题,但我猜你误解了术语“递归”。如果我不能修改任何模块?大写只调用递归方法,然后得到前面模块修改过的文本(如果有的话),然后大写文本并返回它,不带任何字符super@B.DC:你说“不能修改”是什么意思?1) 你可以。2) 你想把这段代码放在哪里,它将遍历祖先并调用它们的实现?@B.DC:如果你的模块不处理
super
,那么它们就不是前置友好的,您可能需要选择其他方法来构建处理管道。@B.DC我仍然不确定我是否真正理解这里的问题,但您可以在不使用超级
(正如所指出的,这是制作前置友好模块的唯一方法)的情况下将功能整合在一起。这是一份基于我对你的情况有限的了解的非常重要的报告