Смотрите код и вывод:
['.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?
говорит:
Передает каждый элемент коллекции для данного блока. Метод возвращает true, если блок никогда не возвращает false или nil.
Ваш первый код puts
возвращает nil
после прохождения первого элемента к блоку. Блок, переданный в all?
, будет продолжаться только тогда, когда каждый элемент будет оцениваться до true
. Таким образом, блок возвращен "temp.txt"
. Во второй версии это не так. Поскольку p
никогда не возвращается nil
. Таким образом, блок оценивается до true
, так как все объекты true
за исключением nil
и false
.
Вы уверены, что оба выпускаете такой же выход? Я думаю нет. повторите проверку. нет ничего «каждого?». :( –