2011-01-08 33 views
41

Tính năng siêu trong mã này là gì?Siêu từ khóa trong Ruby

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

Theo tôi biết nó giống như gọi hàm đệ quy, phải không?

Trả lời

54

no ... super gọi phương thức của lớp cha, nếu nó tồn tại. Ngoài ra, như @EnabrenTane đã chỉ ra, nó cũng chuyển tất cả các đối số cho phương thức lớp cha.

+9

và theo mặc định như gọi là có vượt qua đối số cho hàm mẹ điểm cũng – EnabrenTane

+1

@Enabren rất tốt Tôi không đề cập đến. Tôi cũng sẽ thêm nó – sethvargo

+39

Ngoài ra, nếu bạn viết 'super()' thay vì 'super', sẽ không có đối số nào được truyền cho phương thức của cha mẹ: http://bit.ly/hsQtfD – splicer

49

super gọi một phương thức gốc có cùng tên, với cùng một đối số. Nó rất hữu ích để sử dụng cho các lớp thừa kế.

Dưới đây là một ví dụ:

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' 

Không có giới hạn để bao nhiêu lần bạn có thể gọi super, vì vậy nó có thể sử dụng nó với nhiều lớp kế thừa, như thế này:

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' 

Nếu có không có phương thức cha mẹ cùng tên, tuy nhiên, Ruby nêu ra một ngoại lệ:

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’ 
+5

" super gọi một phương thức cha mẹ giống nhau với cùng một đối số. " An * unadorned * 'super' gọi chúng với cùng các đối số. Không có gì nói rằng đứa trẻ không thể vượt qua một tập con của các tham số cho cha mẹ nếu đó là những gì cha mẹ mất. –

+0

@the Tin Man: Đúng vậy. – vonconrad

+0

Ví dụ tuyệt vời - cảm ơn bạn đã viết chúng ra! – ckib16

16

Các siêu từ khóa có thể được sử dụng để gọi một phương pháp cùng tên trong siêu lớp của lớp thực hiện cuộc gọi.

Nó chuyển tất cả các đối số cho phương thức lớp gốc.

siêu là không giống như siêu()

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: sai số của đối số (1 0)

siêu (không có dấu ngoặc đơn) trong lớp con sẽ gọi phương thức cha mẹ với chính xác cùng một đối số đã được chuyển cho phương thức gốc (vì vậy siêu bên trong Bar # show trở thành siêu ("Hello Ruby") và gây ra lỗi vì phương thức cha không lấy bất kỳ đối số nào)

+0

Giải thích rất hay! Cảm ơn! –

0

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" 
Các vấn đề liên quan