簡體   English   中英

如何使此紅寶石代碼更干燥

[英]How to make this ruby code more DRY

我只是做了以下代碼。 我在語法和模式上看到很多重復(例如,一遍又一遍地使用temp變量r,當它不是nil時追加字符串)。 我怎樣才能使它更干? 我來自C語言背景,只是試圖學習Ruby的抽象和簡化方法以獲得優雅的代碼...

# Traverse a matrix spirally

def subm(m)
  result=[]
  if m.length>1
    m[1..-2].each {|a| result << a[1..-2]}
  end
  result
end

def trav_sp(m)
  result=[]
  if not m.empty?
    result += m[0] if m[0]

    r=[]
    m[1..-1].each {|a| r << a[-1]} if m[1..-1]
    result += r

    r=[]
    if m[-1]
      m[-1].each_with_index{|a,i| (r<< m[-1][-2-i] if m[-1][-2-i])}
      result += r
    end

    r=[]
    m.each_with_index {|a,i| (r<< m[0][-2-i] if m[0][-2-i])}
    result += r

    return result = result + trav_sp(subm(m))
  else
    return result
  end

end

您可以使用map而不是將元素重復添加到臨時數組,以及其他一些更改:

# Traverse a matrix spirally

def subm(m)
    m[1..-2].map {|a| a[1..-2]}
end

def trav_sp(m)
    result = []

    if not m.empty?
        result += m[0] if m[0]
        result += m[1..-1].map {|a| a[-1]} if m[1..-1]

        r = []
        if m[-1]
            m[-1].each_with_index{|a,i| (r<< m[-1][-2-i] if m[-1][-2-i])}
            result += r
        end

        r = []
        m.each_with_index {|a,i| (r << m[0][-2-i] if m[0][-2-i])}
        result += r

        result += trav_sp(subm(m))
    end

    result
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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