Ruby 这两种类似的方法怎么能被烘干呢?

Ruby 这两种类似的方法怎么能被烘干呢?,ruby,Ruby,这两种方法显然有很多相似之处。然而,它们之间的差异非常重要,我还没有找到让它们共享一些代码的方法 非常感谢Ruby大师的任何想法 方法1: def fill_out(page, *fields) methods=[ lambda{|p, f| p.send(f).fit(instance_variable_get f) }, lambda{|p, f| p.send(f).pick!(instance_variable_get f) } ] f

这两种方法显然有很多相似之处。然而,它们之间的差异非常重要,我还没有找到让它们共享一些代码的方法

非常感谢Ruby大师的任何想法

方法1:

def fill_out(page, *fields)    
    methods=[ lambda{|p, f| p.send(f).fit(instance_variable_get f) },
              lambda{|p, f| p.send(f).pick!(instance_variable_get f) } ]
    fields.shuffle.each do |field|
      x = page.send(field).class.to_s=='Watir::Select' ? 1 : 0
      methods[x].call(page, field)
    end
end
方法2:

def fill_out_item(name, page, *fields)  
  methods=[ lambda{|n, p, f| p.send(f, n).fit(instance_variable_get f) },
            lambda{|n, p, f| p.send(f, n).pick!(instance_variable_get f) } ]
  fields.shuffle.each do |field|
    x = page.send(field, name).class.to_s=='Watir::Select' ? 1 : 0
    methods[x].call(name, page, field)
  end
end

如果
n
为零,您似乎只需要
f,n
映射到
f
。可以通过
*[f,n]完成。压缩
n?f:[f,n]

def fill_out_item(name, page, *fields)  
  methods=[ lambda{|n, p, f| p.send(*[f, n].compact).fit(instance_variable_get f) },
            lambda{|n, p, f| p.send(*[f, n].compact).pick!(instance_variable_get f) } ]
  fields.shuffle.each do |field|
    x = page.send(*[field, name].compact).class.to_s=='Watir::Select' ? 1 : 0
    methods[x].call(name, page, field)
  end
end

def fill_out(page, *fields)    
    fill_out_item(nil, page, *fields)
end
不确定为什么需要
lambdas
,除非这是代码的简化版本。您还可以执行以下操作:

def fill_out_item(name, page, *fields)  
  fields.shuffle.each do |field|
    obj = page.send(*[field, name].compact)
    var = instance_variable_get field
    obj.class.to_s == 'Watir::Select' ?  obj.pick!(var) :  obj.fit(var)
  end
end

如果
n
为零,您似乎只需要
f,n
映射到
f
。可以通过
*[f,n]完成。压缩
n?f:[f,n]

def fill_out_item(name, page, *fields)  
  methods=[ lambda{|n, p, f| p.send(*[f, n].compact).fit(instance_variable_get f) },
            lambda{|n, p, f| p.send(*[f, n].compact).pick!(instance_variable_get f) } ]
  fields.shuffle.each do |field|
    x = page.send(*[field, name].compact).class.to_s=='Watir::Select' ? 1 : 0
    methods[x].call(name, page, field)
  end
end

def fill_out(page, *fields)    
    fill_out_item(nil, page, *fields)
end
不确定为什么需要
lambdas
,除非这是代码的简化版本。您还可以执行以下操作:

def fill_out_item(name, page, *fields)  
  fields.shuffle.each do |field|
    obj = page.send(*[field, name].compact)
    var = instance_variable_get field
    obj.class.to_s == 'Watir::Select' ?  obj.pick!(var) :  obj.fit(var)
  end
end

你为什么要把它们弄干?你希望他们经常改变吗?过于“聪明”的干代码比一点点重复要糟糕得多。这些文件已经太“聪明”了。我想,保持可读性的理由是好的。我不希望他们改变,所以。。。也许最好让它们保持原样。命名数组方法会导致名称冲突(通常的方法数组)。虽然您的代码显然不依赖于使用原始的方法数组,但我确实认为避免名称冲突仍然是一种很好的做法。为什么要将它们干涸?你希望他们经常改变吗?过于“聪明”的干代码比一点点重复要糟糕得多。这些文件已经太“聪明”了。我想,保持可读性的理由是好的。我不希望他们改变,所以。。。也许最好让它们保持原样。命名数组方法会导致名称冲突(通常的方法数组)。虽然您的代码显然不依赖于使用原始的方法数组,但我确实认为避免名称冲突仍然是一种很好的做法。谢谢!lambdas是我第一次解决这个问题时不确定这里会使用多少种不同的方法的遗留问题。现在,通过重构,很明显只需要两个,所以您将它们去掉是正确的。呜呼!谢谢你的帮助!谢谢lambdas是我第一次解决这个问题时不确定这里会使用多少种不同的方法的遗留问题。现在,通过重构,很明显只需要两个,所以您将它们去掉是正确的。呜呼!谢谢你的帮助!