如何在Ruby中调用super.super方法

时间:2015-01-21 01:54:59

标签: ruby-on-rails ruby

我有以下课程

class Animal
  def move
    "I can move"
  end
end

class Bird < Animal
  def move
    super + " by flying"
  end
end

class Penguin < Bird
  def move
    #How can I call Animal move here
    "I can move"+ ' by swimming'
  end
end

如何在Penguin中调用Animal的移动方法?我不能使用super.super.move。有什么选择?

由于

4 个答案:

答案 0 :(得分:8)

您可以获取move的{​​{1}}实例方法,将其绑定到Animal,然后调用它:

self

答案 1 :(得分:1)

class Penguin < Bird
  def move
    grandparent = self.class.superclass.superclass
    meth = grandparent.instance_method(:move)
    meth.bind(self).call + " by swimming"
  end
end

puts Penguin.new.move

有关此方法的详细信息,请参阅this answer

答案 2 :(得分:1)

你可以这样做(我建议here):

class Penguin < Bird
  def move
    puts self.class.ancestors[2].instance_method(__method__).bind(self).call +
    ' by swimming'
  end
end

Penguin.new.move
  # I can move by swimming

[编辑:我认为这与@ August的回答非常相似。这有一个小优势,即类Animal和方法名称move都没有硬连线。]

答案 3 :(得分:1)

如果你使用的是Ruby 2.2.0,那么你的新版本就有了新功能。那个的东西是:Method#super_method

class Animal
  def move
    "I can move"
  end
end

class Bird < Animal
  def move
    super + " by flying"
  end
end

class Penguin < Bird
  def move
    method(__method__).super_method.super_method.call + ' by swimming'
  end
end

Penguin.new.move # => "I can move by swimming"

我完全同意Robert Klemme's,他的答案是最好和最干净的。