2014-10-06 3 views
0

У меня возникли проблемы с суммированием массива. Вот мой существующий код:Проблема с суммированием массива в ванильном рубине

pageArray = Array.new 
puts "How many pages long is the book you're reading?" 
pageArray << gets.chomp 
puts "Are you reading any other books right now?" 
yn = gets.chomp 
while yn != "no" do  
    puts "How many pages long is your next book?" 
    pageArray << gets.chomp 
    puts "Are you reading any other books right now?" 
    yn = gets.chomp 
end 
pageSum = pageArray.reduce(:+) 
puts pageSum 

Когда я прохожу и введите значения 100 и 50, окончательное возвращение «10050», а не «150» Мне что-то не хватает?

+2

да. вы нажимаете строки в свой массив, поэтому операция + выполняет объединение, а не целое дополнение. – Doon

ответ

1

Код может быть написан более ясно и более рубин подобное. Вот некоторые непроверенный код, который более идиоматический:

page_array = [] 

puts "How many pages long is the book you're reading?" 
page_array << gets.chomp 

loop do 
    puts 'Are you reading any other books right now?' 
    yn = gets.chomp.downcase 
    break if yn == 'no' 

    puts 'How many pages long is your next book?' 
    page_array << gets.chomp.to_i 
end 

page_sum = page_array.reduce(:+) 
puts page_sum 

Примечание:

  • переменных в Ruby, в snake_case, notInCamelCase.
  • loop do будет работать навсегда. Просто break, когда вы получили значение разрыва.
  • вы должны сложить случай значения, используемого как разрыв, чтобы уловить вариации в 'y' и 'Y'.
  • найдите время, чтобы отформатировать код, чтобы его можно было легко прочитать, даже для быстрых тестов. Удивительно, как часто код, который, по нашему мнению, просто тест, фактически вводится в производство, так что делайте это правильно в первый раз.
+0

Sn, я только что опубликовал почти копию копии вашего ответа, а затем взял его, когда увидел твою. Единственные различия заключались в том, что я поместил мой метод ('puts total_pages()'), не имел переменной 'yn' (' break if gets..') и имел только 'gets.to_i'. Тооф, в реальной жизни вы также должны были бы положить все 'get' в циклы и проверить на достоверность. –

+0

Удивительно, спасибо! Я подумал, что это было довольно просто. Форматирование разбилось на копию-вставку из Sublime Text, я предполагаю, что это связано с моим отсутствием знакомого. – Toof

+0

Чтобы заставить ваш сниппет работать, мне пришлось изменить 'page_array << gets.chomp' на' page_array << gets.chomp.to_i' - это правильно? – Toof

0

Вы вводите строки и конкатенируете их.

Использование gets.chomp.to_i

0

Вам нужно изменить строку, которую вы получаете от gets к междунар.

pageArray << gets.chomp.to_i

+0

'chomp' необязательно здесь, потому что« 123, отмеченный любой строкой символов, включая только символ конца строки, отправил Метод 'to_i' возвращает целое число, полученное из цифр в начале строки ".to_i => 123'. –

+0

да, это правда. – Doon

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