【问题标题】:Ruby arrays methods and outputsRuby 数组方法和输出
【发布时间】:2016-12-05 10:32:18
【问题描述】:

给定一个数字,我的代码应该返回 1 和该数字之间的所有偶数,并按以下格式打印它们:

22
4444
666666
etc...

这是目前为止的代码:

def pattern(n)
  n == 1 ? "" : arr = (1..n).select {|i| i if i % 2 == 0}.each {|item| return (item.to_s * item)}
end

对于任何大于四的数字,它只会返回以下内容:

22

我认为这可能与块中的return 有关。但是,当使用printputs 时,这会返回一个单独的数组元素,如下所示:

[2]

有什么想法可以解决这个问题,以便我可以实现所需的输出?

【问题讨论】:

  • 有时最好多行编码。

标签: arrays ruby string math


【解决方案1】:

此代码解决了您的问题:

def pattern(n)
  n == 1 ? "" : arr = (1..n).select {|i| i if i % 2 == 0}.map {|item| (item.to_s * item)}
end

请注意,我使用的是map 而不是each,并且我没有使用returnreturn 意味着您实际上并没有完成对数字的循环……一旦您到达 2,您就从函数返回。

map 是你想要的,如果你想用结果构建一个新数组。

编辑

稍微清理一下:

def pattern(n)
  n == 1 ? "" : (1..n).select {|i| i.even?}.map {|item| item.to_s * item}
end

arr = 是不必要的。您在 select 中的块应该只返回 true 或 false ...您也可以在那里只使用 i % 2 == 0,但 even? 恰好存在。另外,item.to_s * item 周围的括号是不必要的。

编辑 2

下面的每个 cmets,如果你想要一个字符串,也许这就是你要找的(添加 .join("\n")):

def pattern(n)
  n == 1 ? "" : (1..n).select {|i| i.even?}.map {|item| item.to_s * item}.join("\n")
end

编辑 3

当返回一个字符串时,你也可以跳过n==1这个特殊情况,因为加入一个空数组只会返回一个空字符串:

def pattern(n)
  (1..n).select {|i| i.even?}.map {|item| item.to_s * item}.join("\n")
end

【讨论】:

  • 谢谢你,这肯定有助于理解我的错误。但是,我仍然遇到输出以以下格式出现的问题:[“22”,“4444”]。我尝试对新的映射数组使用 each 方法来产生所需的输出,但这也没有帮助。
  • 也许你想要pattern(8).join("\n")这样的东西?
  • 甚至 [1,2,3,4,5,6].select(&:even?)
【解决方案2】:

您的代码不起作用,因为它在达到第一个值时返回。见:

def pattern n
    return "" if n == 1

    (1..n).select { |i| 
        i if i % 2 == 0
    }.each { |item| 
        return (item.to_s * item) # You are returning here!
    }
end

作为建议,您可以将代码简化为:

def pattern n
    (2..n).step(2) { |n| puts n.to_s * n }
end

或者——甚至更好的 IMO——你返回一个包含所有结果的数组,让调用者决定如何处理它:

def pattern n
    (2..n).step(2).map { |n| n.to_s * n }
end

【讨论】:

  • 谢谢,这绝对是一个更有效的解决方案。但是,任何关于为什么我的代码行为方式的见解?我对它输出值的方式有点困惑。
  • 你总是返回第一个生成的值,这就是为什么输出只有“22”。
  • 你有一个很好的方法,但它并没有完全回答这个问题。 OP 想要返回一个数组并打印这些值。投反对票不是我的,但可能是因为我刚才所说的。
  • @CarySwoveland OP 知道如何打印值,他的问题是找出为什么pattern 停在“22”。我想我可以直接解决问题,而不是编写不必要的代码。但我理解你的意思。
  • 看起来不错。答案中不需要“@edit”。我建议你像写书或写博客一样写答案。它可能会经过一些草稿。编辑时,您不会保留已修订的部分,因为它只会无缘无故地淡化文本。你也不会在你的文本中填写那些提出这个和那个改进的人的名字。评论是此类归因的好地方:“感谢您的建议。我已经编辑了我的答案以合并它。”保持紧。最后,首先回答问题,然后提出如何改进代码。
【解决方案3】:

这是解决问题的另一种方法,使用Integer#times

def pattern n
  (2..n).each do |i|
    next if i.odd?            
    i.times { print i }
    puts
  end
end

pattern 8
#=>
# 22
# 4444
# 666666
# 88888888

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多