[英]Ruby arrays methods and outputs
給定一個數字,我的代碼應返回介於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
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
此代碼可解決您的問題:
def pattern(n)
n == 1 ? "" : arr = (1..n).select {|i| i if i % 2 == 0}.map {|item| (item.to_s * item)}
end
請注意,我使用的是map
而不是each
map
,也不使用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
這是使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.