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.