这两种类似的方法怎样才能被驱逐?

时间:2013-10-23 18:44:08

标签: 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) } ]
    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

1 个答案:

答案 0 :(得分:1)

如果f,n为零,您似乎只需要f映射到n。可以通过*[f,n].compactn ? 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