Từ khóa yield
Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 17 trên 56.
Các phương thức bạn tự định nghĩa có thể nhận một khối lệnh, giống như các phương thức dựng sẵn. Bên trong phương thức, từ khóa yield chạy khối lệnh mà bên gọi truyền vào.
def greet
puts "Before block"
yield
puts "After block"
end
greet do
puts "Hi from the block!"
end
# Trước khối lệnh
# Xin chào từ khối lệnh!
# Sau khối lệnhBạn có thể truyền đối số vào khối lệnh bằng cách đưa chúng cho yield:
def with_each(items)
items.each { |item| yield item }
end
with_each([10, 20, 30]) { |n| puts n }
# 10
# 20
# 30Nếu một phương thức gọi yield nhưng bên gọi không truyền khối lệnh nào, Ruby sẽ báo lỗi. block_given? giúp bạn kiểm tra trước:
def maybe
yield if block_given?
end
maybe # không có gì xảy ra
maybe { puts "called!" } # đã gọi!Thử thách
DễĐịnh nghĩa một phương thức tên là repeat nhận một đối số n (một số nguyên) và lần lượt truyền các giá trị 1, 2, ..., n cho khối lệnh của nó.
Sau đó gọi phương thức của bạn với n = 4 và một khối lệnh in ra "Got <value>" cho mỗi giá trị được truyền vào.
Đầu ra là:
Got 1
Got 2
Got 3
Got 4Tự làm thử
# TODO: định nghĩa `repeat` để truyền các số từ 1 đến n vào khối lệnh của nó
# TODO: gọi repeat(4) với một khối lệnh in ra "Got <value>"
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng xử lý
1Tìm hiểu sâu về chuỗi
Tổng quan về phương thức chuỗiNội suy chuỗiDuyệt qua chuỗiTách và nối chuỗiÔn tập: Đan chuỗi4Khối lệnh, Proc và lambda
Khối lệnh là gì?do..end và dấu ngoặc nhọnTừ khóa yieldTham số của khối lệnhProc và lambdaÔn tập: bộ lặp tùy chỉnh7Hash, phần 2
Hash.new với giá trị mặc địnhLặp qua HashHash lồng nhauGộp và chuyển đổiÔn tập: Bộ đếm tần suất10Dự án: Hồ sơ học sinh
Tổng quan dự ánThêm học sinh2Phạm vi
Phạm vi là gì?Các phương thức của phạm viPhạm vi trong case / whenÔn tập: luyện tập với phạm vi5Sức mạnh của Enumerable
select và rejectNối chuỗi mapreduce / injectcount, all?, any?, none?group_by và partitionsort_by, min_by, max_byÔn tập: quy trình dữ liệuTự luyện tập: Trình biên dịch Ruby online