2016-02-12 2 views
0

У меня есть этот кодКак метод Array # select работает точно в рубине? И почему он возвращает пустой массив или оригинальный?

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] 

Так что я знаю, что массив # выберите вызывает блок прохождение в последовательных элементах из себя, возвращая массив, содержащий те элементы, для которых блок возвращает истинное значение. Как он ведет себя в этих примерах кода, чтобы я мог понять, почему он возвращает эти значения.

ответ

4

Array#select создает новый массив, используя элементы вашего массива, которые возвращают правду из блока.

В вашем первом случае последней строкой вашего блока является оператор puts, который всегда возвращает ноль. Следовательно, [].

В вашем втором случае последняя строка вашего блока всегда является числом, поэтому всегда правдиво. Следовательно, выход равен входному.

+0

И почему в первом примере кода он не возвращает [nil, nil, nil]? –

+0

Он делает подмножество вашего массива, используя только те элементы, которые возвращают правду. Элементы, которые возвращают нуль, не добавляются вообще. – msergeant

+0

На самом деле я знаю, почему ... потому что все в рубине правдиво, кроме фальшивых и ноль? –