Menu
CoddyTech

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)   # 14

lambda 类似,但限制更严格,它会检查你传入的参数数量是否正确。箭头形式 -> 是常见的写法:

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。

challenge icon

挑战

简单

创建一个名为 tripler 的 lambda,它接收一个数字,并返回该数字乘以 3 的结果。

然后读取一个以逗号分隔的整数列表,并分别在单独的行中打印:

  1. 调用 tripler.call(10) 的结果
  2. 将输入的数字乘以 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,再用 ", " 连接结果
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Ruby 在线编译器