Proc 和 Lambda
本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 19 课,共 56 课。
代码块不是对象,你不能把它存储在变量中。如果你想要一段可以传递、保存并在之后调用的代码,就要把它包装在 Proc 或 lambda 中。
使用 Proc.new 或 proc 关键字创建 Proc。使用 .call 调用它:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14lambda 类似,但限制更严格,它会检查你传入的参数数量是否正确。箭头形式 -> 是常见的写法:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16(.call 的简写)在前面加上 &,就可以将两者传递给需要代码块的方法:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]如果你想进行更严格的参数检查,就使用 lambda;如果你想要更宽松、更灵活的行为,就使用 Proc。
挑战
简单创建一个名为 tripler 的 lambda,它接收一个数字,并返回该数字乘以 3 的结果。
然后读取一个以逗号分隔的整数列表,并分别在单独的行中打印:
- 调用
tripler.call(10)的结果 - 将输入的数字乘以 3(使用
map(&tripler)),并用,连接
输入 1,2,3 时,输出为:
30
3, 6, 9亲手试试
# TODO:将 `tripler` 定义为 lambda 表达式
numbers = gets.chomp.split(",").map(&:to_i)
# TODO:第 1 行,打印 tripler.call(10)
# TODO:第 2 行,用 &tripler 映射 numbers,再用 ", " 连接结果
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Ruby 在线编译器