Ruby数组方法和输出

给定一个数字,我的代码应该返回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 

如果任何数字大于4,则只返回以下内容:

 22 

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

 [2] 

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

此代码修复了您的问题:

 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

根据下面的评论,如果你想要一个字符串,也许这就是你要找的东西(添加.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 

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

 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 

通过使用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