有什么理由让Ruby方法返回splat-list?

时间:2014-03-12 01:43:54

标签: ruby syntax

在Ruby语言源代码lib/fileutils.rb中,方法mkdir_p在简化时如下所示:

def mkdir_p(list, options={})
  return *list if options[:noop]
  # ...
  return *list
end

从我对Ruby和测试的理解来看,这里的splat都没有意义。是否有任何边缘情况会产生影响?

相关地说,如果没有边缘情况会导致输出产生差异,那么splat是完全无害的还是会导致任何Ruby解释器执行额外的(不必要的)工作?

1 个答案:

答案 0 :(得分:8)

return lreturn *l之间实际上存在差异;它有助于知道要寻找什么。

一个重要的区别是它使Array 实现了枚举器的副本 - 在所有情况下都会返回 new 数组。

def x(l)
   return *l
end

p = ["hello"]
q = x(p)
q[0] = "world"

# p -> ['hello']
# q -> ['world']

u = x(0.upto(2))
# u -> [0, 1, 2]  - Enumeration is forced

另一个区别是splat运算符会将nil强制转换为空数组,它会将其他(非数组/枚举数)值强制转换为一个元素的数组 - 同样, new 在所有情况下都返回数组。

r = x(nil)
# r -> []

s = x("one")
# s -> ['one']

因此,使用return *l具有微妙的含义,希望通过方法文档或其他方式足够好地覆盖"并不令人惊讶"在使用中。