这种反射方法可以用一个参数而不是两个参数编写吗?

时间:2013-01-29 21:13:33

标签: ruby watir-webdriver

这主要是一个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)

这甚至可能吗?

1 个答案:

答案 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