1

明らかに多くの類似点があるこれら 2 つの方法があります。しかし、それらの違いは根本的なものであるため、コードを共有する方法をまだ見つけていません。

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
4

1 に答える 1

1

if is nilf,nにマップする必要があるようです。または経由で実行できますfn*[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 に答える