是这样的
word = 'word'
words = []
puts 'enter some words, man. ill tell em to you in alphabetical order.'
puts 'when your're done, just press enter without typing anything before.'
puts ''
word = gets.chomp
while word != ''
word = gets.chomp
list = list.push word
end
puts ''
puts 'Your alphabetically ordered words are:'
puts list.sort
puts ''
同样,除了我提交给它的第一个单词之外,这是有效的。如有任何提示或帮助,不胜感激。
现在可以运行了
word = gets.chomp
while word != ''
list = list.push word
word = gets.chomp
end
在您的情况下,在将第一个word
推入list
之前(当您刚刚进入while
循环时),您再次调用Kernel#gets
并将分配给word
。这就是为什么您丢失了第一个单词,并且从第二个开始将单词推入数组。
与函数式方法比较:
sorted_words =
(1..Float::INFINITY)
.lazy
.map { gets.chomp }
.take_while { |word| !word.empty? }
.sort
如果您意识到赋值返回的是赋值,则可以使此代码更简洁。
list = []
until (word = gets.chomp).empty? do
list << word
end
这是另一种重写程序的方法,也许用一种更直观、更有表现力的方式:
word = 'word'
list = []
puts 'enter some words, man. ill tell em to you in alphabetical order.'
puts 'when your're done, just press enter without typing anything before.'
puts ''
keep_going = true
while keep_going
word = gets.chomp
keep_going = false if word.empty?
list = list.push word if keep_going
end
puts ''
puts 'Your alphabetically ordered words are:'
puts list.sort
puts ''