制作用户输入的排序数组

时间:2016-04-29 14:31:55

标签: ruby

我正在通过Chris Pine的'学习编程'来学习Ruby。在第10章我应该编写一个程序,用户可以根据自己的喜好输入任意数量的单词,完成后,他可以在空行上按Enter并退出。 我想出了这个:

puts "Type whatever you want!"
index = 0 
word = ''
array = []
while word != nil
    word << gets.chomp
    array[index] = word
    index = index + 1
end
puts ''
puts array.sort

但这不起作用。我错过了什么?有没有其他方法可以定义word而不必重复它?

4 个答案:

答案 0 :(得分:1)

word不会有nil值。它将是一个空字符串。所以你需要检查一下:

while word != ""

# or even better
while !word.empty?

此外,您要将所有内容添加到word。您可能想要分配给它:

word = gets.chomp

每位作者的评论

begin 
  # your code here 
end while !word.empty?

# OR more readable
begin 
  # your code here 
end until word.empty?

答案 1 :(得分:1)

使用loop可能会简化代码:

a = []

loop do
  input = gets.chomp
  if input.empty?
    break
  else
    a << input
  end
end

a.sort!
puts a

答案 2 :(得分:1)

这是一个简单的循环,你只需要踢即可:

arr = []
arr << $_.strip until gets =~ /^\s*$/
puts arr.sort

$_是一个特殊变量,用于计算从STDIN读取的最后一个输入。所以基本上这会读取&#34;调用gets并检查输入是否只是空格。如果它然后退出循环,否则将带有空格删除值的最后一个输入附加到数组上并继续循环。&#34;

甚至更有趣,一个班轮:

puts [].tap {|arr| arr << $_.strip until gets =~ /^\s*$/}.sort

除了使用tap初始化变量外,基本上与上述相同。

回答您的问题:

  

有没有其他方法可以定义单词而不必重复它?

使用side effects作业。在ruby中,当您指定变量时,该赋值的返回值是指定的变量,如:

irb(main):001:0> (variable = 2) == 2
=> true

这个想法是将作业放在你的条件中。如果我在一个易于理解的循环中写这样的东西,而不是上面那些,我会写这样的东西:

arr = []
while !(word = gets.strip).empty?
  arr << word
end
puts arr.sort

答案 3 :(得分:0)

如果我正确地阅读了这个问题,似乎有一个更简单的解决方案。

你可以这样做:

user_input = gets.chomp.split(" ").sort

离)

输入:bananas clementine zebra tree house plane mine

输出:["bananas", "clementine", "house", "mine", "plane", "tree", "zebra"]