删除ruby中的代码重复

时间:2013-08-19 14:11:35

标签: ruby coding-style

有更简洁的方式来写这个吗?我不喜欢那个代码重复。

# Adds the content of two arrays except the first cell because the first cell is a string
# The arrays don't have to be the same length.
# * *Args*  :
#  - +a+ -> first array
#  - +b+ -> second array
#
def add_array(a,b)
  if a.size >= b.size then
    a.map.with_index{ |m,i|if i != 0 then m + b[i].to_i else m end}
  else
    b.map.with_index{ |m,i|if i != 0 then m + a[i].to_i else m end}
  end
end

输入示例:

arr1 = ["foo",1,2,3,4,5]
arr2 = []
arr3 = ["foo",2,4,6,5,7,8,9,4,5,6]


arr2 =  add_array(arr1, arr2)
puts arr2.inspect
arr2 = add_array(arr2, arr3)
puts arr2.inspect

输出:

["foo", 1, 2 ,3 ,4 ,5]
["foo", 3, 6, 9, 9, 12, 8, 9, 4, 5, 6]

随意评论/批评和表达你的想象力!

感谢。

4 个答案:

答案 0 :(得分:2)

以我谦虚的新手意见;

def add_array(a,b)
  a, b = b, a if b.size > a.size
  a.map.with_index{ |m,i|if i != 0 then m + b[i].to_i else m end}
end

编辑:Polonium的建议更好。

答案 1 :(得分:1)

第一步:

def add_array(a,b)
  if a.size > b.size then
    a.map.with_index{ |m, i| if i != 0 then m + b[i].to_i else m end}
  else
    add_array(b, a)
  end
end

答案 2 :(得分:1)

def add_array(a,b)
  a.map.with_index { |m, i| i.zero? && m || m + choose(a, b)[i].to_i }
end

def choose(a, b)
  if a.size > b.size
    b
  else
    a
  end
end

根据大小选择数组的顺序意味着你可以在其他地方使用它。

删除if if是我努力的目标。

所有样本数据都已经是整数,但我将强制保留为整数。

答案 3 :(得分:1)

def add_array(a,b)
  a.size > b.size ? merge_arrays(a,b) : merge_arrays(b,a)
end

def merge_arrays(a,b)
 a.map.with_index{ |m,i|if i != 0 then m + b[i].to_i else m end}
end

在这种情况下,对阵列大小的检查只进行一次。我介绍了这个新功能,以确保它更具可读性。