在Ruby语言源代码中lib/fileutils.rb,方法mkdir_p在简化时如下所示:
def mkdir_p(list, options={})
return *list if options[:noop]
# ...
return *list
end
Run Code Online (Sandbox Code Playgroud)
根据我对Ruby和测试的理解,这里没有任何意义.是否有任何边缘情况会有所不同?
相关地,如果没有边缘情况会导致输出产生差异,那么splat是完全无害的还是会导致任何Ruby解释器执行额外的(不必要的)工作?
实际上return l和之间存在差异return *l; 它有助于知道要寻找什么.
一个重要的区别是它创建了Array 或物化枚举器的副本 - 在所有情况下都返回一个新的 Array.
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
Run Code Online (Sandbox Code Playgroud)
另一个区别是splat操作符将强制nil转换为空数组,它会将其他(非数组/枚举器)值强制转换为一个元素的数组 - 同样,在所有情况下都会返回一个新数组.
r = x(nil)
# r -> []
s = x("one")
# s -> ['one']
Run Code Online (Sandbox Code Playgroud)
因此,使用return *l具有微妙的含义,希望这些含义很好地被方法文档覆盖或者在使用中"不足为奇".
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |