有编号的参数示例

103 阅读2分钟

我们很可能都与带参数的Ruby块互动过。也许我们看到过这样的东西:

squared_numbers = (1...10).map { |num| num ** 2 }

从Ruby 2.7开始,我们有一个替代的语法可以用来表达这个相同的语句。Ruby允许我们使用以下划线为前缀的数字来指代参数,而不是命名参数(|num| 以上)。在上面的例子中,由于该块有一个参数,我们可以使用_1 来引用之前的num

squared_numbers = (1...10).map { _1 ** 2 }

如果有多个参数,我们用数字顺序来指代不同的参数,因为如果它们被命名的话,它们会被排序。例如,在一个哈希上迭代,我们有一个键(city 以下)和值(population 以下)参数。所以这个:

city_populations = { "Tokyo" => 37_435_191,
"Delhi" => 29_399_141, "Shanghai" => 26_317_104 }

city_populations.each { |city, population|
puts "Population of #{city} is #{population}" }

...变成了使用编号参数的这个:

city_populations.each { puts "Population of #{_1} is #{_2}" }

使用编号参数或命名参数

只有在我们不给参数命名的情况下,编号参数才能发挥作用。一旦我们给它们起了名字,我们就不能再尝试用数字来访问它们。

squared_numbers = (1...10).map { |num| _1 ** 2 }

# SyntaxError (ordinary parameter is defined)

样式说明

在完成这个提示之前,需要注意的是,虽然在某些情况下,编号参数更简单,但也有一些时候,编号参数会使代码比命名参数更难阅读和理解。我在简单的区块中使用编号参数,而在区块中出现任何复杂的逻辑时就使用命名参数。

一定要和你的团队商定,什么时候使用编号参数或命名参数在风格上是合适的