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

Thành Thạo Yield & Yield_Self Trong Ruby: Hướng Dẫn Toàn Diện

Từ „yield“ trong Ruby nghĩa là gì? Và nó làm chính xác cái gì?

Vâng…

Yield là từ khóa (nghĩa là nó là phần cốt lõi của ngôn ngữ) & nó được dùng bên trong phương thức để gọi một block.

Đây là những gì bạn cần biết:

  • Gọi block chạy code bên trong block đó (giống gọi phương thức)
  • Yield có thể truyền bất kỳ số lượng đối số nào cho block
  • Giá trị trả về của block trở thành giá trị trả về cho yield

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

Bạn có thể coi block như phương thức không tên có thể truyền như đối số thêm cho phương thức khác.

Ví dụ:

def make_salad
yield "lettuce"
yield "carrots"
yield "olive oil"
end
make_salad { |ingredient| puts "Adding #{ingredient} to salad!" }

Điều này gọi block 3 lần, tạo ra đầu ra này:

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

Đó là bản chất của yield, giống như gọi phương thức, nhưng thay vào đó bạn đang gọi block.

Chúng ta không có tên cho block, nên từ khóa này lo việc đó.

Bây giờ:

Hãy khám phá điều gì xảy ra nếu bạn không có block để gọi.

Yield Không Có Block == Thông Báo Lỗi

Nếu bạn gọi yield mà không có block, bạn sẽ nhận lỗi.

Ví dụ:

def write_code
yield
end
write_code # LocalJumpError: no block given (yield)

Lỗi này rõ ràng, „no block given“ nghĩa là lời gọi phương thức write_code không cung cấp block.

Làm sao ngăn chặn lỗi này?

Như sau:

def write_code
yield if block_given?
end

Phương thức block_given? kiểm tra xem block có sẵn không & cho phép bạn chỉ yield nếu đúng.

Tại Sao Dùng Yield?

Dùng yield kích hoạt block.

Chúng ta dùng block để truyền mẩu code như một phần của lời gọi phương thức.

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

  • Bạn muốn viết hàm ghi log chung, ghi log thời gian một mẩu code chạy
  • Bạn muốn chạy code khi phương thức xong (giống „callbacks“ trong Javascript)
  • Bạn muốn „code lười“, code chỉ chạy khi cần & có thể tùy chỉnh bởi người dùng (ví dụ đọc về phương thức Hash#fetch)

Tuyệt!

Yield_Self – Khác Biệt Là Gì?

Bạn có thể tìm thấy phương thức mới yield_self & nghĩ nó liên quan đến yield.

Vâng, nó không.

Thậm chí yield(self) khác, vì self tham chiếu đến đối tượng hiện tại.

Nơi yield_self, được thêm trong Ruby 2.5, tham chiếu đến đối tượng chúng ta đang gọi phương thức trên nó.

Việc dùng tốt cho phương thức này?

Dùng nó bất cứ khi nào bạn muốn chuỗi phương thức (chain methods) & làm gì đó với đối tượng bạn đang gọi yield_self trên.

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

Ví dụ:

n_squared = ->(n) { n ** 2 }
2
.yield_self(&n_squared)
.yield_self(&n_squared)
# 16

Trong Ruby 2.6, có alias cho yield_self, phương thức then.

Nhưng đừng nhầm lẫn với yield thường.

Được chứ?

Yield Trong Rails

Tôi cũng nên nhắc nhanh đến việc dùng yield trong Rails & các template engine.

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

Rails thay thế nó bằng nội dung của view bạn đang render.

Không yield nghĩa là layout trống!

Đó là cách layout & view của bạn được kết hợp lại.

Tóm Tắt

Bạn đã học về từ khóa yield trong Ruby! Chính xác nó là gì, cách nó hoạt động & tại sao nó quan trọng.

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

Cảm ơn bạn đã đọc! 🙂