这主要是一个Ruby问题,但我用watir-webdriver标记了它,因为该示例包含watir-webdriver代码,希望它能提高清晰度。
我有一个类可以检索和更新网页上的数据。该数据存储在类的实例变量中。
该类包含一个方法,该方法将使用现有的实例变量值来更新网页上的选择列表,或者,如果实例变量为nil,它将获取选择列表的值并将其存储在实例变量中
该方法目前如下所示:
def get_or_select!(inst_var_sym, select_list)
value = instance_variable_get inst_var_sym
if value==nil
instance_variable_set inst_var_sym, select_list.selected_options[0].text
else
select_list.select value
end
end
这有效,但我想知道是否有办法编写方法,使其可以直接应用于实例变量(而不是实例var的符号匹配器),并将其作为单个参数, select_list对象。
换句话说,目前看起来像这样:
get_or_select!(:@instance_variable, select_list)
我想看起来像这样:
@instance_variable.get_or_select!(select_list)
这甚至可能吗?
答案 0 :(得分:1)
新答案: 由于变量在您定义之前不存在,因此您无法在其上调用方法。调用类必须设置它。如果检查,你可以做一个简单的事。
#In the calling class, not the variable class
if @instance_variable # If it is defined, this is true
returned_list = select_list.select @instance_variable.value # Gets the selected list
else
@instance_variable = instance_variable_set inst_var_sym, select_list.selected_options[0].text
end
旧答案如下: 你能否使用条件赋值? http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators#1._Assignment
x = find_something() #=>nil
x ||= "default" #=>"default" : value of x will be replaced with "default", but only if x is nil or false
x ||= "other" #=>"default" : value of x is not replaced if it already is other than nil or false
所以这就像......
instance_variable_get inst_var_sym ||= instance_variable_set inst_var_sym, select_list.selected_options[0].text