Супер ключевое слово в рубине - PullRequest
48 голосов
/ 08 января 2011

Для чего супер в этом коде?

def initialize options = {}, &block
  @filter = options.delete(:filter) || 1
  super
end

Насколько я знаю, это похоже на рекурсивный вызов функции, верно?

Ответы [ 5 ]

61 голосов
/ 08 января 2011

нет ... super вызывает метод родительского класса, если он существует. Кроме того, как указал @EnabrenTane, он также передает все аргументы методу родительского класса.

54 голосов
/ 08 января 2011

super вызывает родительский метод с тем же именем и теми же аргументами. Это очень полезно использовать для унаследованных классов.

Вот пример:

class Foo
  def baz(str)
    p 'parent with ' + str
  end
end

class Bar < Foo
  def baz(str)
    super
    p 'child with ' + str
  end
end

Bar.new.baz('test') # => 'parent with test' \ 'child with test'

Нет ограничений на количество вызовов super, поэтому его можно использовать с несколькими унаследованными классами, например:

class Foo
  def gazonk(str)
    p 'parent with ' + str
  end
end

class Bar < Foo
  def gazonk(str)
    super
    p 'child with ' + str
  end
end

class Baz < Bar
  def gazonk(str)
    super
    p 'grandchild with ' + str
  end
end

Baz.new.gazonk('test') # => 'parent with test' \ 'child with test' \ 'grandchild with test'

Если нет родительского метода с тем же именем, Ruby вызывает исключение:

class Foo; end

class Bar < Foo
  def baz(str)
    super
    p 'child with ' + str
  end
end

Bar.new.baz('test') # => NoMethodError: super: no superclass method ‘baz’
20 голосов
/ 13 марта 2014

Ключевое слово super можно использовать для вызова метода с тем же именем в суперклассе класса, выполняющего вызов.

Передает все аргументы методу родительского класса.

super не совпадает с super ()

class Foo
  def show
   puts "Foo#show"
  end
end

class Bar < Foo
  def show(text)
   super

   puts text
  end
end


Bar.new.show("Hello Ruby")

ArgumentError: неверное числоАргументы (1 для 0)

super (без скобок) внутри подкласса вызовут родительский метод с точно такими же аргументами, которые были переданы в оригинальный метод (поэтому супер внутри Bar # show становится супер ("Здравствуйте, Ruby ") и вызывает ошибку, потому что родительский метод не принимает аргументов)

0 голосов
/ 16 июня 2019

Super в методе класса, скажем test_method, используется для вызова другого метода с тем же именем, т.е. test_method родительского класса.Код, написанный выше и ниже ключевого слова super, будет выполняться нормально, а вместо ключевого слова super будет добавлен весь набор действий кода метода super class.

0 голосов
/ 07 февраля 2016

Бонус:

module Bar
    def self.included base
        base.extend ClassMethods
    end

    module ClassMethods
        def bar
            "bar in Bar"
        end
    end
end

class Foo
    include Bar
    class << self
        def bar
            super
        end
    end
end

puts Foo.bar # => "bar in Bar"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...