Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Thành thạo từ khóa super Ruby: Gọi phương thức cha hiệu quả

Từ khóa super trong Ruby làm gì?

Nó gọi phương thức trên class cha với cùng tên phương thức gọi super.

Ví dụ:

Nếu bạn gọi phương thức tên i_like_chocolate, rồi gọi super bên trong, Ruby tìm phương thức cùng tên trên class cha của owner phương thức này.

Này bubble lên qua ancestry chain class như lời gọi method bình thường.

Nếu method không tồn tại sẽ trigger NoMethodError exception, và nếu tìm thấy method_missing sẽ dùng đó.

Bây giờ:

Hãy xem ví dụ code!

Super Không Đối Số

Trong ví dụ sau chúng ta có class Cat kế thừa Animal.

Class Cat có phương thức name dùng super gọi cùng phương thức trên class cha (Animal).

Code:

 class Animal
  def name
    puts "Animal"
  end
end
class Cat < Animal
  def name
    super
  end
end
cat = Cat.new
cat.name # "Animal" 

Từ khóa super Ruby hành xử khác khi dùng có hoặc không đối số.

Không đối số:

Nó truyền đối số dùng cho lời gọi method gốc sang lời gọi mới, kể cả keyword argument và block nếu cho.

Ví dụ:

 def puts(*)
  super
end
puts 1, 2, 3 

Phương thức này, định nghĩa ngoài class, thuộc Object. Nghĩa là nó được gọi trước puts gốc.

Bây giờ:

Khi bạn gọi puts, bạn gọi phương thức mới chúng ta tạo, nó dùng super gọi puts gốc.

Khi nào dùng Super vs Super()

Chúng ta xem cách dùng super gọi phương thức cha.

Nhưng nếu phương thức cha không nhận cùng số đối số?

Lúc đó bạn dùng:

  • super() cho không đối số
  • super(arg1, arg2, ...) chọn đối số muốn truyền

Ví dụ:

 def puts
  super()
end 

Chú ý ngoặc đơn có ý nghĩa đặc biệt ở đây, khác lời gọi method thường.

Một vài điều biết về super:

  • Chỉ dùng được bên trong phương thức
  • Trả về kết quả từ gọi phương thức cha
  • Có thể gọi nhiều lần

Dòng in đậm (super trả kết quả) là key hiểu một số use case super bạn gặp ngoài đời.

Bạn dùng super implement decorator pattern, hoặc gọi trong initialize để khởi tạo instance variable trên class cha.

Tóm tắt

Bạn đã học về từ khóa super Ruby, nó là gì & cách hoạt động trong tình huống khác nhau!

Nếu thích bài này bạn có muốn đăng ký newsletter RubyGuides nhận thêm content giống này & tip Ruby hữu ích chỉ dành cho subscriber.