我有这两种方法显然有许多相似之处。但是,它们之间的区别很大,我还没有想出让他们分享一些代码的方法。
非常感谢来自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
答案 0 :(得分:1)
如果f,n
为零,您似乎只需要f
映射到n
。可以通过*[f,n].compact
或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