在ruby中返回多个值,用于调用函数

时间:2014-02-11 07:42:56

标签: css ruby xpath capybara incompatibility

是否可以从函数返回多个值?

我想将返回值传递给另一个函数,我想知道是否可以避免将数组分解为多个值

我的问题? 我正在为我的项目升级Capybara,我意识到,感谢CSS 'contains' selector & upgrade of Capybara,下面的陈述将不再有效

has_selector?(:css, "#rightCol:contains(\"#{page_name}\")")

我希望以最小的努力工作(有很多这样的情况),所以我想出了使用Nokogiri将css转换为xpath的想法。我想写它以便上面的函数可以成为

has_selector? xpath(:css, "#rightCol:contains(\"#{page_name}\")")

但是由于xpath必须返回一个数组,我需要实际写这个

has_selector?(*xpath(:css, "#rightCol:contains(\"#{page_name}\")"))

有没有办法解决以前的行为?

为简洁起见,可以假设现在xpath func如下所示。

def xpath(*a)
  [1,2]
end

2 个答案:

答案 0 :(得分:0)

您不能让方法返回多个值。为了做你想做的事,你必须改变has_selector?,可能是这样的:

alias old_has_selector? :has_selector?
def has_selector? arg
  case arg
  when Array then old_has_selector?(*arg)
  else old_has_selector?(arg)
  end
end

答案 1 :(得分:0)

Ruby对从函数返回多个值的支持有限。特别是,当分配给多个变量时,返回的数组将被“解构”:

def foo
  [1, 2]
end

a, b = foo
a #=> 1
b #=> 2   

但是在你的情况下你需要splat(*)来表明你不仅仅是将数组作为第一个参数传递。

如果你想要一个更清晰的语法,为什么不写自己的包装器:

def has_xpath?(xp)
  has_selector?(*xpath(:css, xp))
end