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
有关。 但是,使用print
或puts
,将返回单个数组元素,如下所示:
[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
,而且我没有使用return
。 return
意味着你实际上并没有完成数字的循环…一旦你得到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