2

Enumerable#all?我一直对and的用例感到困惑Enumerable#each。例如

['.txt', '-hello.txt'].all? do |suffix|
        puts "temp#{suffix}"
      end

为我工作,也为

['.txt', '-hello.txt'].each do |suffix|
        puts "temp#{suffix}"
      end

也为我工作。

我应该选择.all?什么.each

4

2 回答 2

5

all?评估您传递给它的块,true如果所有元素都满足它,则返回,false否则返回。

each是一种使用块遍历可枚举对象的方法。它将评估每个对象的块。在您的情况下,您想使用each.

查看所有文档? 这里每个 这里

于 2013-04-10T07:16:38.400 回答
1

查看您的代码和输出:

['.txt', '-hello.txt'].all? do |suffix|
        puts "temp#{suffix}"
end
p "======================="
['.txt', '-hello.txt'].each do |suffix|
        puts "temp#{suffix}"
end

输出:

temp.txt
"======================="
temp.txt
temp-hello.txt

但现在的问题是为什么第一个代码中的“temp.txt”?. 是的,作为puts回报nil。现在见下图:

['.txt', '-hello.txt'].all? do |suffix|
        p "temp#{suffix}"
end
p "======================="
['.txt', '-hello.txt'].each do |suffix|
        puts "temp#{suffix}"
end

输出:

"temp.txt"
"temp-hello.txt"
"======================="
temp.txt
temp-hello.txt

解释:

Enum#all?说:

将集合的每个元素传递给给定的块。如果块从不返回false 或 nil ,则该方法返回true

您的第一个代码在将第一个元素传递给块后puts返回。nil仅当每个项目评估为 时,传递给的块all?才会继续true。因此块返回"temp.txt"。在第二个版本中不是这种情况。因为p永远不会回来nil。因此该块的计算结果为true,因为所有对象都是truenilfalse

于 2013-04-10T07:36:59.537 回答