yield 关键字
本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 17 课,共 56 课。
你自己定义的方法也可以接收代码块,就像内置方法一样。在方法内部,关键字 yield 会运行调用者传入的代码块。
def greet
puts "Before block"
yield
puts "After block"
end
greet do
puts "Hi from the block!"
end
# 代码块之前
# 来自代码块的问候!
# 代码块之后你可以通过向 yield 传递参数来向代码块传递参数:
def with_each(items)
items.each { |item| yield item }
end
with_each([10, 20, 30]) { |n| puts n }
# 10
# 20
# 30如果一个方法调用了 yield,但调用者没有传入代码块,Ruby 就会引发错误。block_given? 可以让你先进行检查:
def maybe
yield if block_given?
end
maybe # 什么也没发生
maybe { puts "called!" } # called!挑战
简单定义一个名为 repeat 的方法,它接收一个参数 n(整数),并依次将值 1, 2, ..., n 逐个传递给代码块。
然后调用这个方法,设置 n = 4,并传入一个代码块,为每个传递的值打印 "Got <value>"。
输出为:
Got 1
Got 2
Got 3
Got 4亲手试试
# TODO: 定义 `repeat`,向代码块依次传入 1..n
# TODO: 调用 repeat(4),传入一个打印 "Got <value>" 的代码块
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Ruby 在线编译器