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

Hiểu Về Từ Khóa Self Của Ruby: Hướng Dẫn Rõ Ràng Để Sử Dụng Hiệu Quả

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:

  • self là từ khóa. Giá trị của nó phụ thuộc vào nơi bạn dùng nó
  • itself là phương thức. Giá trị của nó phụ thuộc vào đối tượng bạn dùng nó trên (trong 1.itself, 1 là đố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! 🙂