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

Hiểu Yield &Yield_Self trong Ruby (Toàn bộ Hướng dẫn)

Từ “năng suất” trong Ruby có nghĩa là gì? Và chính xác thì nó làm gì?

Chà…

Lợi nhuận là một từ khóa (có nghĩa là nó là một phần cốt lõi của ngôn ngữ) và nó được sử dụng bên trong các phương pháp để gọi một khối.

Đây là những điều bạn cần biết :

  • Gọi một khối sẽ chạy mã bên trong khối đó (giống như gọi một phương thức)
  • Lợi nhuận có thể chuyển bất kỳ số lượng đối số nào vào khối
  • Giá trị trả lại của khối trở thành giá trị trả về cho yield

Bạn phải hiểu các khối để điều này có ý nghĩa.

Bạn có thể coi các khối là các phương thức không có tên có thể được truyền như các đối số bổ sung cho các phương thức khác.

Đây là một ví dụ :

def make_salad
  yield "lettuce"
  yield "carrots"
  yield "olive oil"
end

make_salad { |ingredient| puts "Adding #{ingredient} to salad!" }

Thao tác này gọi khối 3 lần, tạo ra kết quả đầu ra này :

Adding lettuce to salad!
Adding carrots to salad!
Adding olive oil to salad!

Về bản chất, đó là những gì yield không, giống như gọi một phương thức, nhưng thay vào đó bạn đang gọi khối.

Chúng tôi không có tên cho khối, vì vậy từ khóa này sẽ đảm nhiệm việc đó.

Bây giờ :

Hãy cùng khám phá điều gì sẽ xảy ra nếu bạn không gọi được.

Lợi nhuận không có khối ==Thông báo lỗi

Nếu bạn gọi yield mà không có khối, thì bạn sẽ gặp lỗi.

Ví dụ :

def write_code
  yield
end

write_code

# LocalJumpError: no block given (yield)

Lỗi này rất rõ ràng, "không có khối nào được đưa ra" có nghĩa là phương thức gọi write_code không cung cấp một khối.

Làm cách nào để bạn có thể ngăn chặn lỗi này?

Như thế này:

lợi nhuận
def write_code
  yield if block_given?
end

block_given? phương pháp kiểm tra xem có khối nào không và điều này cho phép bạn chỉ yield nếu đó là sự thật.

Tại sao sử dụng Lợi nhuận?

Sử dụng yield cho phép các khối.

Chúng tôi sử dụng các khối để chuyển các bit mã như một phần của lệnh gọi phương thức.

Điều đó hữu ích khi :

  • Bạn muốn viết một hàm ghi nhật ký chung, ghi lại thời gian một bit mã chạy mất bao lâu
  • Bạn muốn chạy một số mã khi phương thức này được thực hiện xong (chẳng hạn như “lệnh gọi lại” trong Javascript)
  • Bạn muốn "mã lười", mã chỉ chạy khi cần thiết và có thể được tùy chỉnh bởi người dùng (ví dụ về điều này, hãy đọc về Hash#fetch phương pháp)

Tốt!

Yield_Self - Sự khác biệt là gì?

Bạn có thể tìm thấy yield_self mới này &nghĩ rằng nó có liên quan đến yield .

Chà, không phải vậy.

Chẵn yield(self) khác nhau, bởi vì self đề cập đến đối tượng hiện tại.

Trường hợp yield_self , đã được thêm vào trong Ruby 2.5, đề cập đến đối tượng mà chúng tôi đang gọi phương thức trên đó.

Cách sử dụng tốt cho phương pháp này?

Sử dụng nó bất cứ khi nào bạn muốn chuỗi các phương thức và làm điều gì đó với đối tượng mà bạn đang gọi yield_self trên.

Trong khi trả về kết quả, thay vì đối tượng ban đầu.

Ví dụ :

n_squared = ->(n) { n ** 2 }

2
.yield_self(&n_squared)
.yield_self(&n_squared)

# 16

Trong Ruby 2.6, có một bí danh cho yield_self , then phương pháp.

Nhưng đừng nhầm nó với yield thông thường của bạn .

Ok?

Năng suất trong Rails

Tôi cũng nên đề cập nhanh đến việc sử dụng yield trong Rails &công cụ tạo khuôn mẫu.

Bạn sẽ tìm thấy yield bố cục bên trong.

Rails thay thế nó bằng nội dung của chế độ xem mà bạn đang hiển thị.

Không có yield bằng bố cục trống!

Đó là cách bố cục và chế độ xem của bạn được kết hợp với nhau.

Tóm tắt

Bạn đã học về từ khóa lợi nhuận trong Ruby! Chính xác nó là gì, nó hoạt động như thế nào và tại sao nó lại quan trọng.

Bây giờ, hãy thử nó trong mã Ruby của bạn.

Cảm ơn vì đã đọc! 🙂