Menu
CoddyTech

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ệnh

Bạ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
# 30

Nế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!
challenge icon

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 4

Tự 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>"
quiz iconTự kiểm tra

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ý

Tự luyện tập: Trình biên dịch Ruby online