2015-03-23 5 views
0

Я хотел бы знать, какой элемент находится в пустом массиве.Что находится в пустом массиве?

Я понимаю, что вызов each на Array с блоком будет итерировать, хотя все элементы в Array и оценить блок.

Но вот где я запутаться:

[].each { |e| puts e } 
=> [] 

[].each { |e| puts e.random_method } 
=> [] 

кажется, что я могу вызвать любой метод на e в each блоке, а консоль рубин всегда будет возвращать []. Если e были nil, не должен ли он поднимать недостающую ошибку метода? Любые объяснения?

+0

Это поднимет отсутствующий метод ошибка только тогда, когда массив содержит любой элемент. В вашем примере вызов 'puts e.random_method' никогда не достигается. – backpackerhh

+0

Как «Если' e' были «нил», относящиеся к вашему вопросу? – sawa

ответ

10

Есть несколько вещей, о которых вы ошибаетесь.

  1. e не nil. Нет e. «У меня нет жен. Каждая из моих жен была космическим монстром». правда. Блок вообще не оценивается, потому что ничего не было в наборе. [], пустой массив, отличается от [nil], одноэлементным массивом с nil в качестве его единственного элемента (когда e действительно был бы nil, а e.random_method сбой). Посмотрите на это следующим образом: если [1, 2].each { .... } выполняет блок дважды, [1].each { .... } один раз, то [].each { .... } выполняет его нулевое время, а не один раз с nil.

  2. each возвращает исходный массив. [].each { .... }[]. [1, 2, 3].each { .... }[1, 2, 3]. Там нет никакой тайны - возвращаемое значение не имеет отношения к вашему вопросу. Вам интересно, что выйдет в результате puts - и это не то, что [] есть. Нет вывода puts, так как он выполняется в нулевое время (см. Выше).

Так, чтобы ответить на титульной вопрос - нет ничего в пустой массив, поэтому мы называем его «пустым» :)

+0

Спасибо, что указали мои ошибки. –

+0

Возможно, стоит отметить, что жизнь была бы намного сложнее для нас, если бы пустые массивы не обрабатывались таким образом (но все же стоит жить). Кстати, у меня есть друг, который также говорит: «Каждая из моих жен была космическим монстром». –

+0

потрясающий информация) – potashin

0

Проверить следующие

2.0.0-p598 :001 > [].each { |e| puts e } #Here loop is never get executed because array is blank 
=> [] 
2.0.0-p598 :002 > [nil].each { |e| puts e * e } #here loop is getting executed once but throws an error 
NoMethodError: undefined method `*' for nil:NilClass 
    from (irb):2:in `block in irb_binding' 
    from (irb):2:in `each' 
    from (irb):2 
    from /home/cybage/.rvm/rubies/ruby-2.0.0-p598/bin/irb:12:in `<main>' 

2.0.0-p598 :003 > [1].each { |e| puts e * e } #here you can see loop executed once print '1' and then `each` returns the array itself. 
=> 1 
=> [1] 
Смежные вопросы