数组#选择方法在红宝石中是如何工作的?以及为什么它返回一个空数组或原始数组



我有这个代码

arr = [1, 2, 3].select do |n|
  n + 2
  puts n
end

输出为

1
2
3

返回值为

[]

然后我有这个代码

arr = [1, 2, 3].select do |n|  
  n + 2
end

返回值为

[1, 2, 3]

所以我知道 Array#select 调用从 self 传入连续元素的块,返回一个数组,其中包含块返回 true 值的那些元素。它在这些代码示例中的行为方式,以便我可以理解它为什么返回这些值。

Array#select使用数组中从块返回 truthy 的元素创建一个新数组。

在第一种情况下,块的最后一行是一个始终返回 nil 的 puts 语句。因此[].

在第二种情况下,块的最后一行始终是一个数字,因此始终是真实的。因此,输出等于输入。

Array#select返回一个新数组,其中包含从块返回true的所有元素。它通过迭代每个元素,将其传递给块,运行块,如果块返回 true,它将元素放入新数组中,否则它将跳过它,一旦完成,它将返回一个新数组。

话虽如此,在深入研究您遇到的问题之前,我们应该首先了解其他一些事情。

1(在Ruby中有一个概念叫做Truthiness。这意味着除nilfalse之外的每个元素的计算结果都是true 。以我运行此条件为例

if 'happy puppy'
  puts "I'm the happiest puppy"
end

你会看到输出I'm the happiest puppy。那是因为字符串,不是falsenil,将计算为true。相反,如果运行此代码

if nil
  puts "Truthiness means all things evaluate to true except nil and false"
end

在此示例中,条件不会输出字符串,因为nil计算结果不为 true。

2(仔细注意方法输出和返回的内容。在内核#放置的情况下,它输出n并返回nil。当传递给Array#select的块被调用时,它会运行块中的每一行代码,包括puts。这就是为什么我们看到每个数字输出的原因。然后,这是重要的部分,它返回nil.现在还记得诚实的规则吗?因为这是块中的最后一行代码,所以它是整个块的隐式返回。这意味着块将返回计算结果为 false 的nil

3(现在进入Array#select,它的工作原理是遍历数组中的每个元素并调用其上的块。根据块的返回值,它将决定该元素是否属于返回数组。在第一个示例中,puts 用于最后一行并返回 nil这意味着块将始终计算为 false。这就是为什么它输出元素,但随后返回一个空数组。在第二个示例中,块中的最后一行是n+2,其计算结果为整数。这就是真实性发挥作用的地方,整数(或除 false 或 nil 之外的任何内容(将始终计算为 true。这意味着块始终返回 true。这就是数组中返回所有元素的原因。

最新更新