Ruby数组方法和输出

时间:2016-07-31 02:43:53

标签: arrays ruby string math

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

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