2012-08-04 45 views
1

我只是做了下面的代码。我在语法和模式中看到很多重复(比如一次又一次使用临时变量r,并且在不为零时追加字符串)。我怎样才能让这更干?我在C背景,只是想学习Ruby的方式来抽象和简化,以获得优雅的代码...如何让这个红宝石代码更干DRY

# 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

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