Computer >> Máy Tính >  >> Lập trình >> Ruby

Bản thân trong Ruby là gì và Cách sử dụng nó (Giải thích rõ ràng)

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ó (trong 1.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! 🙂