2015-07-09 4 views
1

Я застрял в этой проблеме. Буду признателен за любую помощь.умножить массив используя каждый на рубине

инструкция «Использование метода .each на массиве шансов распечатать двойное значение каждого элемента массива. Другими слова, умножить каждый элемент 2.

Убедитесь в использовании напечатайте, а не ставьте, поэтому ваш вывод появится на одной строке ».

Мой код

odds = [1,3,5,7,9] 

odds.each do |placeholder| 
    odds *= 2 
    print odds 
end 
+0

печать 'placeholder', а не' odds' –

+0

Попробуйте вставить 'ставит "заполнитель = # {заполнитель]"' в первой строке блока. –

ответ

0

Вы пытаетесь умножить Arrayodds на два в каждой итерации в коде. Значение do |placeholder| означает «для каждого элемента массива, дайте мне один элемент и назовите его placeholder».

Таким образом, вам нужно будет использовать placeholder *= 2.

Однако, поскольку вы не изменяете исходное значение в odds, вы можете сократить свой внутренний блок только на print placeholder * 2.

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

odds.map{ |i| i*2 } 
+0

Может кто-нибудь объяснить их нижестоящий? –

2
odds.each { |x| print "#{x*2}" } 

рубиново-иш путь:

print odds.map {|x| x*2}.join(' ') 
+1

'' '' '' не нужно для 'map'.'each' создаст' Enumerator', который позволит 'map' работать, потому что' Enumerator' включает в себя модуль Enumnable', но поскольку 'Array' также включает' Enumerable', просто 'map' будет достаточно. – engineersmnky

+0

удивительный. :) еще лучше – Mircea

0

odds ваш массив. placeholder представляет значение из массива. Без явного предоставления вам ответа, то, что вы хотите сделать, - умножить значение на 2, а не сам массив.

4
odds = [1,3,5,7,9] 
odds.each do |placeholder| 
    odds *= 2 
    print odds 
end 

Ваше использование #each правильно здесь, но помните, что #each получает ::Enumerable объект, блок передается в использует переменную placeholder инкапсулировать значение в ::Array в текущей точке итерации. Поэтому вам нужно будет использовать placeholder для извлечения значения, которое вы хотите удвоить, а не odds, потому что odds все равно будет ::Array в функции ::Enumerable#each.

Этот код можно записать в две строки следующим образом:

odds = [1,3,5,7,9] 
odds.each {|placeholder| print placeholder * 2 } 

Строго говоря, #map будет предпочтительным способом для этого.

+1

Почему вы (и другие плакаты) думаете, что «карта» предпочтительнее? Я не согласен. '[1,3,5,7,9] .map {| заполнитель | print placeholder * 2} 'создает бесполезный массив' nils', на который ссылается ничто. Вся цель 'map' заключается в создании массива, но в этом случае никто не запрашивал массив. 'каждый' в порядке. – steenslag

+0

@steenslag это будет работать красиво, хотя 'print * odds.map {| x | x * 2} ', хотя я согласен с тем, что OP сказал, используя' each', хотя я думаю, что технически почти все методы «Enumerable» используют каждый – engineersmnky

+0

http://ruby-doc.org/core-2.2.0/Array.html См. Функцию :: Массив #map в рубиновых документах. –

0

Здесь И сделаны, что успешно

odds = [1,3,5,7,9] 
odds.each do |x| 
    x *= 2 
    print x 
end 
+0

Его переход к следующему моменту в codeacdemy –

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