Một khối có thể tự gọi một cách đệ quy miễn là nó được lưu trữ trong một biến có thể truy cập bởi chính khối đó. Ví dụ:
def f(x)
block = lambda do |y|
# some calculation on value, or simply yield to the block passed to f()
yield y
block.call(y - 1) if y > 0
end
block.call(x)
end
f(4) do |x|
puts "Yielded block: #{x}"
end
Hoặc, bạn có thể trả lại khối đệ quy, được liên kết với khối người gọi và sau đó gọi khối đó. Ví dụ:
def g
block = lambda do |y|
# some calculation on value, or simply yield to block passed to g()
yield y
block.call(y - 1) if y > 0
end
end
printing_descender = g do |x|
puts "Encapsulated block: #{x}"
end
printing_descender.call(4)
Đầu ra:
Yielded block: 4
Yielded block: 3
Yielded block: 2
Yielded block: 1
Yielded block: 0
Encapsulated block: 4
Encapsulated block: 3
Encapsulated block: 2
Encapsulated block: 1
Encapsulated block: 0
Nguồn
2014-03-03 23:33:13
Tôi nên thêm rằng các trường hợp đệ quy vẫn phải có khối liên kết, trong trường hợp không rõ ràng. – DigitalRoss