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?
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?
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.
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’
" 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. –
@the Tin Man: Đúng vậy. – vonconrad
Ví dụ tuyệt vời - cảm ơn bạn đã viết chúng ra! – ckib16
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")
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)
Giải thích rất hay! Cảm ơn! –
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"
và theo mặc định như gọi là có vượt qua đối số cho hàm mẹ điểm cũng – EnabrenTane
@Enabren rất tốt Tôi không đề cập đến. Tôi cũng sẽ thêm nó – sethvargo
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