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ậndef 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! 🙂