2013-04-10 2 views
2

Я продолжаю путаться с прецедентом Enumerable#all? и Enumerable#each. НапримерКакой правильный вариант использования для Enumerable # all? и Enumerable # каждый в Ruby?

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

работает для меня, а также

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

работает для меня тоже.

Что мне выбрать .all? или .each?

+0

Вы уверены, что оба выпускаете такой же выход? Я думаю нет. повторите проверку. нет ничего «каждого?». :( –

ответ

5

all? оценивает блок, который вы передаете ему, и возвращает true, если все элементы удовлетворяют его и false в противном случае.

each - это способ перебора перечислимого объекта с блоком. Он будет оценивать блок для каждого объекта. В вашем случае вы хотите использовать each.

Просмотреть документацию для все?here и каждыйhere.

+0

Аналогично 'any?'возвращает' true', если ** один ** из элементов оценивает блок на 'true'. – Candide

+0

@Candide Да, это правда. Я не знаю, все ли в этом вопросе. :) – squiguy

+0

Спасибо ... Это действительно помогло –

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' с первого кода?. Да как putsnil. Ниже в настоящее время:

['.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.

Смежные вопросы