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