2015-09-04 3 views
0

В Ruby Я ищу, чтобы создать короткую программу, в которой пользователь может ввести определенное количество слов (5 на данный момент), и программе нужно плевать слова вернуться к пользователю в алфавитном порядке, и каждое слово должно чередоваться со всеми CAPS ко всем строчным буквам.Ruby Array/Loop/.each do - Simplest Answer

Эта программа может использовать только такие методы, как (.each do, .sort, .upcase, .downcase), массивы, циклы и операторы if/else. NOTHING ELSE ... поэтому нет индексов, словарей, модулей, аргументов и т. Д. Синтаксис не должен сильно отличаться от того, что я уже написал.

Это код, который у меня есть до сих пор ... Я продолжаю получать ошибку метода ... любая помощь будет принята с благодарностью.

words = [] 

5.times do 
    puts "Please enter a word" 
    words << gets.chomp 
end 

words.sort.each do |odd, even| 
    if odd puts words.upcase 
    elsif even puts words.downcase 
    end 
end 
+1

Что вы подразумеваете под «методами вроде»? Всякий раз, когда возникает исключение, важно идентифицировать линию, в которой оно происходит. –

+1

'words.sort' даст вам и массив отсортированных слов. 'each' затем передает каждый элемент отсортированного массива в блок, присваивая их первой блочной переменной' odd'. Поскольку каждая строка передается каждый раз, блочная переменная 'even' всегда будет равна« nil ». Вот почему блок не работает так, как вам хотелось бы. Возможно, вам будет полезно добавить следующее в начале блока: 'puts 'odd = # {odd}, even = # {even}" '. –

ответ

1

Первый цикл, заполняющий массив, в порядке.

words.sort.each do |odd, even| 
    if odd puts words.upcase 
    elsif even puts words.downcase 
    end 
end 

Это не работает. each берет одно слово из отсортированного массива и «передает» его в блок. Блок использует для этого переменную «odd». Поскольку переменная «even» не получила значения, она будет равна нулю.

В следующей строке Руби решает, если odd правда, и так как он не false или nil, Руби решает это, так puts words.upcase выполняется. words Однако, будучи Массивным, не знает о том, как все это происходит, и говорит вам об этом, допустив ошибку.

Следующий код использует переменную как «переключатель»; он включается, если он выключен и наоборот.

words = [] 

5.times do 
    puts "Please enter a word" 
    words << gets.chomp 
end 

up = true # the toggle 

words.sort.each do |word| 
    if up then 
    puts word.upcase 
    up = false 
    else 
    puts word.downcase 
    up = true 
    end 
end 
0

Edit: Я не видел этот пост на @steenslag, когда я отправил этот ответ, но он немного отличается в способе ввода генерируется, так что я оставлю его, если это не желательно, чтобы я удалить его, в этом случае я буду.

puts "Enter 5 words separated by spaces: " 
words = gets.chomp! 
results = words.split(" ").sort! 
caps = true 
results.each do |word| 
    if caps == true 
    puts word.upcase 
    caps = false 
    elsif caps == false 
    puts word.downcase 
    caps = true 
    end 
end 
0

Я согласен с тем, что идея с переключателем - это путь, который уже предлагают другие анонсы.

Я бы просто упростить блок немного, потому что в Ruby, нет необходимости проверять тумблер явно против true или false, ни вам нужно изменить переключатель явно true или false в каждой итерации просто переключить его:

upcase = true 
words.sort.each do |word| 
    puts(upcase ? word.upcase : word.downcase) 
    upcase = !upcase 
end