明确地称呼以前的祖先

时间:2018-03-28 14:42:55

标签: ruby

我有一个班级Text,我在其中添加了不同的模块,例如CapitalizeTrim。最后,我得到:

Text.ancestors # => [Capitalize,Trim,Text,Object,Kernel]

我想调用一个纠正文本的方法。通过调用一个返回带有前一个祖先行为的文本的方法,我想递归遍历每个祖先,直到我到达Text类,然后返回文本。

我有问题。每个模块和类都有相同的方法correct_text,我不能创建任何别名。当我通过Capitalize时,它没有问题,但是当我递归调用Trim中的方法时,我无法在此祖先(私有方法或使用send)上调用该方法,因为在Capitalize上有一个名称相同的方法,最终根据顺序调用。

是否可以在祖先上调用方法?是否可以在不使用prepend的情况下撤消include / extend / undef_method

1 个答案:

答案 0 :(得分:2)

只需在前置方法中调用super即可。

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"