如何使这个ruby代码更干燥

时间:2012-08-04 00:55:30

标签: ruby refactoring metaprogramming dry

我刚刚做了以下代码。我在语法和模式中看到了很多重复(比如一次又一次地使用临时变量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

1 个答案:

答案 0 :(得分:1)

您可以使用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