簡體   English   中英

Ruby數組方法和輸出

[英]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有關。 但是,當使用printputs ,這將返回單個數組元素,如下所示:

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM