我正在通过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
而不必重复它?
答案 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"]