【问题标题】:Ruby Array/Loop/.each do - Simplest AnswerRuby Array/Loop/.each do - 最简单的答案
【发布时间】:2015-09-04 21:39:10
【问题描述】:

在 Ruby 中,我希望创建一个短程序,用户可以在其中输入一定数量的单词(目前为 5 个),并且程序需要按字母顺序将单词吐回给用户,并且每个单词必须从全部大写字母交替到全部小写字母。

此程序只能使用(.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

【问题讨论】:

  • 你所说的“类似方法”是什么意思?每当引发异常时,重要的是要确定它发生的行。
  • words.sort 会给你和排序的单词数组。 each 然后将排序数组的每个元素传递给块,将它们分配给第一个块变量odd。由于每次都传递一个字符串,因此块变量even 将始终等于nil。这就是为什么该块没有按您希望的那样执行。您可能会发现在块的开头添加以下内容会有所帮助:puts "odd=#{odd}, even=#{even}"

标签: arrays ruby loops


【解决方案1】:

第一个循环,填充数组,很好。

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

这不起作用。 each 从排序后的数组中取出一个单词并将其“输入”到块中。该块为其使用变量“odd”。由于变量“even”没有取值,所以会是nil。

在下一行,Ruby 判断odd 是否为真,因为不是falsenil,Ruby 判断它是,所以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

【讨论】:

    【解决方案2】:

    编辑:当我发布这个答案时,我没有看到@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
    

    【讨论】:

      【解决方案3】:

      我同意切换的想法是其他答案已经建议的方式。

      我只是稍微简化一下这个块,因为在 Ruby 中,不需要在每次迭代中显式地检查切换到 truefalse,也不需要将切换显式更改为 truefalse,只需切换它:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 2015-07-05
        • 1970-01-01
        • 2011-07-12
        相关资源
        最近更新 更多