2015-09-04 49 views
0

在Ruby中,我正在创建一个简短的程序,用户可以输入一定数量的单词(现在为5),程序需要吐出单词以字母顺序返回给用户,并且每个单词必须从全部大写变为全部小写字母。Ruby Array/Loop/.each do - 最简单的答案

该程序只能使用像(.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是真实的,因为它不是falsenil,红宝石决定它,所以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

编辑:我还没有看到由@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是不需要检查拨动明确反对truefalse,也不需要显式更改切换到truefalse在每次迭代中,只需拨动它:

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