1

我有这两种方法,显然有很多相似之处。但是,它们的区别是根本性的,以至于我还没有找到让它们共享一些代码的方法。

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

方法一:

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

方法二:

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
4

1 回答 1

1

看来您只需要f,n映射到fifn为零。可以通过*[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
于 2013-10-23T20:32:38.780 回答