Вызов супер-методов в Ruby - PullRequest
1 голос
/ 23 апреля 2011

Я пытаюсь определить некоторые классы в Ruby, которые имеют иерархию наследования, но я хочу использовать один из методов базового класса в производном классе. Суть в том, что я не хочу вызывать точный метод, в котором я нахожусь, я хочу вызвать другой. Следующее не работает, но это то, что я хочу сделать (в основном).

class A
    def foo
        puts 'A::foo'
    end
end

class B < A
    def foo
        puts 'B::foo'
    end
    def bar
        super.foo
    end
end

Ответы [ 2 ]

5 голосов
/ 23 апреля 2011

Наверное, это то, что вы хотите?

class A
  def foo
    puts 'A::foo'
  end
end

class B < A
  alias bar :foo
  def foo
    puts 'B::foo'
  end
end

B.new.foo # => B::foo
B.new.bar # => A::foo
0 голосов
/ 05 декабря 2015

Более общее решение.

class A
  def foo
    puts "A::foo"
  end
end

class B < A
  def foo
    puts "B::foo"
  end
  def bar
    # slightly oddly ancestors includes the class itself
    puts self.class.ancestors[1].instance_method(:foo).bind(self).call
  end
end

B.new.foo # => B::foo
B.new.bar # => A::foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...