Подтвердить что ты не робот

Супер ключевое слово в Ruby

Что такое супер в этом коде?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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’

Ответ 3

Ключевое слово 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 становится супер ( "Hello Ruby" ) и вызывает ошибку, потому что родительский метод не принимает никаких аргументов)

Ответ 4

Bonus:

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"

Ответ 5

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