Nếu bạn đang học Ruby, bạn có thể thấy việc dùng từ khóa „self“ rất gây nhầm lẫn.
Nó hoạt động như thế nào?
self chính xác là gì?
Đó là một từ khóa Ruby cho bạn quyền truy cập vào đối tượng hiện tại.
Nếu bạn không biết đối tượng là gì, hãy xem video tôi làm cho bạn. Nó liên quan đến Lập Trình Hướng Đối Tượng.
„Đối tượng hiện tại“ này phụ thuộc vào ngữ cảnh.
Ngữ cảnh?
Có, ngữ cảnh là nơi code của bạn đang ở tại bất kỳ thời điểm nào.
Ví dụ:
Nếu code của bạn nằm trong phương thức instance, self là một instance của lớp đó. Nói cách khác, self là một đối tượng.
Bạn có thể thấy điều này trong hành động.
Chạy code này:
def coffee puts self end coffee # main
Code này định nghĩa & gọi phương thức coffee in giá trị của self.
Tại sao nó in main?
Vì đó là tên của đối tượng cấp cao nhất, nó là đối tượng nơi bạn tìm thấy tất cả phương thức được định nghĩa bên ngoài lớp.
Như phương thức coffee của chúng ta ở đây.
Nhưng nếu bạn định nghĩa phương thức bên trong lớp tên Cat, thì self sẽ là đối tượng Cat.
Như thấy ở đây:
class Cat def meow puts self end end Cat.new.meow #
Từ các ví dụ này, chúng ta có thể thấy giá trị của self thay đổi tùy thuộc vào nơi bạn dùng nó.
Bây giờ:
Tôi tin bạn có thể hiểu bất cứ thứ gì tốt hơn bằng cách hiểu mục đích của nó.
Tại sao self hữu ích?
Hãy xem một số ví dụ.
Dùng Self Để Phân Biệt
Một việc thực tế dùng cho self là để có thể phân biệt giữa phương thức & biến cục bộ.
Không phải ý tưởng tốt đặt tên biến & phương thức giống nhau. Nhưng nếu bạn phải làm việc với tình huống đó, bạn sẽ có thể gọi phương thức với self.method_name.
Đây là ý tôi:
class Example def do_something banana = "variable" puts banana puts self.banana end def banana "method" end end Example.new.do_something # "variable" => puts banana # "method" => puts self.banana
Ở đây chúng ta có biến cục bộ banana, bên trong phương thức do_something, nhưng chúng ta cũng có phương thức banana.
Biến cục bộ có ưu tiên.
Đó là lý do chúng ta cần dùng self ở đây nếu muốn gọi phương thức banana, thay vì in giá trị của biến banana.
Tiếp theo:
Hãy xem trường hợp dùng phổ biến hơn… Định nghĩa phương thức cấp lớp!
Dùng Self Để Định Nghĩa Phương Thức Cấp Lớp
Việc dùng số MỘT cho self,毫无疑 ngần chút, là định nghĩa phương thức cấp lớp (class-level methods).
Tôi chắc bạn đã thấy chúng.
Những định nghĩa phương thức def self.method_name này.
Như cái này:
class Salad def self.buy_olive_oil # ... end end Salad.buy_olive_oil
self ở đây tương đương với Salad, tên lớp.
Tại sao điều này hữu ích?
Vì chúng ta không phải dùng tên lớp cho mỗi định nghĩa phương thức, làm code dễ thay đổi hơn nếu đổi tên lớp.
Nó cũng làm code ít nhiễu hơn & dễ đọc hơn.
Đó là lý do chúng ta làm def self.buy_olive_oil thay vì def Salad.buy_olive_oil.
Các Việc Dùng Khác Cho Self
Có!
Còn nhiều việc dùng khác cho self, nên nó là thứ hữu ích để làm quen.
Ví dụ:
Bạn có thể dùng nó trong phương thức để so sánh đối tượng hiện tại với đối tượng khác.
Giống như thế này:
def ==(other) self == other end
Bạn cũng có thể dùng self cho mục đích debug, để tìm ra bạn đang làm việc với đối tượng nào.
Như sau:
p self
Hoặc bạn có thể dùng nó làm giá trị trả về, để triển khai các mẫu thiết kế như Builder Design Pattern.
Ví dụ:
class Salad def initialize @ingredients = [] end def add_nuts @ingredients << :nuts self end end my_salad = Salad.new.add_nuts
Tóm lại, đây là danh sách các việc dùng hữu ích cho self:
- Định nghĩa phương thức cấp lớp
- Dùng phương thức instance khi bạn có biến cục bộ cùng tên
- Trả về Self (builder pattern)
- Debugging
- So sánh đối tượng (==)
- Người nhận mặc định của lời gọi phương thức
Self vs Itself
Một điều nữa chúng ta nên xem trước khi kết thúc chủ đề này.
Phương thức Kernel#itself.
Đó là phương thức bạn có thể gọi trên đối tượng & đối tượng sẽ trả về chính nó.
Ví dụ:
[1,2,3,nil].select(&:itself) # [1, 2 ,3]
Ví dụ này lọc giá trị nil & false.
Hiểu sự khác biệt:
selflà từ khóa. Giá trị của nó phụ thuộc vào nơi bạn dùng nóitselflà phương thức. Giá trị của nó phụ thuộc vào đối tượng bạn dùng nó trên (trong1.itself,1là đối tượng)
Hy vọng điều đó hữu ích.
Kết Luận
Bạn đã học về từ khóa self của Ruby, chính xác nó là gì, tại sao nó hữu ích & cách dùng nó.
Bây giờ đến lượt bạn thử nó.
Cảm ơn bạn đã đọc! 🙂