Nếu đang học Ruby, bạn có thể thấy việc sử dụng từ khóa “self” rất khó hiểu.
Nó hoạt động như thế nào?
self
là gì , chính xác?
Đó là từ khóa Ruby cung cấp 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 đồ vật là gì, hãy xem video này 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.
Bối cảnh?
Có, ngữ cảnh là nơi mã của bạn ở bất kỳ thời điểm nào.
Đây là một ví dụ :
Nếu mã của bạn nằm trong một phương thức phiên bản, self
là một trường hợp của lớp đó. Nói cách khác, self
là một đối tượng.
Bạn có thể tự mình thực hiện điều này.
Chạy mã này :
def coffee puts self end coffee # main
Mã này định nghĩa và gọi một coffee
phương thức in giá trị của self
.
Tại sao nó in main
?
Bởi vì nó là tên của đối tượng cấp cao nhất, nó là đối tượng mà bạn sẽ tìm thấy tất cả các phương thức được xác định bên ngoài một lớp học.
Thích coffee
của chúng tôi tại đây.
Nhưng nếu bạn xác định một phương thức bên trong một lớp có tên Cat
, rồi đến self
sẽ là một Cat
đối tượng.
Như đã thấy ở đây :
class Cat def meow puts self end end Cat.new.meow # <Cat:0x7a14c5>
Từ những ví dụ này, chúng ta có thể nói rằng giá trị của self
thay đổi tùy thuộc vào nơi bạn sử dụng nó.
Bây giờ :
Tôi tin rằng bạn có thể hiểu bất cứ điều 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ụ.
Sử dụng bản thân để phân định
Một cách sử dụng thực tế cho self
là có thể phân biệt được sự khác biệt giữa một phương thức và một biến cục bộ.
Không phải là một ý tưởng tuyệt vời nếu đặt tên một biến và một 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 đó, thì bạn sẽ có thể gọi phương thức với self.method_name
.
Đây là ý của 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ó một banana
biến cục bộ, bên trong do_something
nhưng chúng ta cũng có banana
phương pháp.
Biến cục bộ được ưu tiên.
Đó là lý do tại sao chúng ta cần sử dụng self
ở đây nếu chúng ta muốn gọi banana
thay vì in giá trị của banana
biến.
Tiếp theo :
Hãy xem xét một trường hợp sử dụng phổ biến hơn… Định nghĩa các phương thức của lớp!
Sử dụng phương pháp tự xác định cấp độ lớp
Số MỘT sử dụng cho self
, không nghi ngờ gì nữa, là xác định các phương thức cấp lớp.
Tôi chắc rằng bạn đã nhìn thấy chúng.
def self.method_name
này phương thức định nghĩa .
Thích cái này :
class Salad def self.buy_olive_oil # ... end end Salad.buy_olive_oil
self
này ở đây tương đương với Salad
, tên lớp.
Tại sao điều này hữu ích?
Bởi vì chúng tôi không phải sử dụng tên lớp cho mỗi định nghĩa phương thức, làm cho mã của chúng tôi dễ thay đổi hơn nếu chúng tôi thay đổi lớp.
Nó cũng làm cho mã ít ồn hơn và đọc tốt hơn.
Đó là lý do tại sao chúng tôi thực hiện def self.buy_olive_oil
thay vì def Salad.buy_olive_oil
.
Các mục đích sử dụng khác cho bản thân
Vâng!
Thậm chí còn có nhiều cách sử dụng hơn cho self
, vì vậy đó là một điều hữu ích để làm quen với.
Ví dụ :
Bạn có thể sử dụng nó trong một phương thức để so sánh đối tượng hiện tại với đối tượng khác.
Một cái gì đó như thế này :
def ==(other) self == other end
Bạn cũng có thể sử dụng self
cho mục đích gỡ lỗi, để tìm ra đối tượng bạn đang làm việc với.
Như thế này :
p self
Hoặc bạn có thể sử dụng nó làm giá trị trả về, để triển khai các mẫu thiết kế như Mẫu thiết kế người xây dựng.
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 cách sử dụng hữu ích cho bản thân :
- Xác định các phương thức cấp lớp
- Sử dụng phương thức phiên bản khi bạn có một biến cục bộ cùng tên
- Tự quay lại (mẫu trình tạo)
- Gỡ lỗi
- So sánh các đối tượng (==)
- Người nhận mặc định của các cuộc gọi phương thức
Bản thân so với bản thân
Một điều nữa chúng ta nên xem xét trước khi hoàn thành chủ đề này.
Bản thân Kernel#itself
phương pháp.
Đó là một phương thức mà bạn có thể gọi trên một đối tượng và đối tượng sẽ tự trả về.
Ví dụ :
[1,2,3,nil].select(&:itself) # [1, 2 ,3]
Ví dụ này lọc nil
&false
giá trị.
Hiểu sự khác biệt :
-
self
là một từ khóa. Giá trị của nó phụ thuộc vào nơi bạn sử dụng nó -
itself
là một phương pháp. Giá trị của nó phụ thuộc vào cái gì đối tượng bạn sử dụng nó (trong1.itself
,1
là đối tượng)
Hy vọng điều đó hữu ích.
Kết luận
Bạn đã tìm hiểu về từ khóa tự Ruby, chính xác nó là gì, tại sao nó hữu ích và cách sử dụng nó.
Bây giờ đến lượt bạn thử.
Cảm ơn vì đã đọc! 🙂