Ruby 语言源代码,lib/fileutils.rb
,方法 mkdir_p
简化后如下所示:
def mkdir_p(list, options={})
return *list if options[:noop]
# ...
return *list
end
从我对 Ruby 的了解和测试来看,这里没有意义。是否有任何边缘情况会产生影响?
相关地,如果不存在这会影响输出的边缘情况,splat 是完全无害的还是会导致任何 Ruby 解释器执行额外(不必要的)工作?
最佳答案
return l
和return *l
其实是有区别的;这有助于了解要查找的内容。
一个重要的区别是它生成数组的副本或物化枚举器——在所有情况下都会返回一个新数组。 p>
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
强制转换为一个空数组,并将其他(非数组/枚举器)值强制转换为一个元素的数组 - 同样,新 在所有情况下都返回数组。
r = x(nil)
# r -> []
s = x("one")
# s -> ['one']
因此,使用 return *l
具有微妙的含义,希望方法文档充分涵盖这些含义,否则在使用中“不足为奇”。
关于ruby - Ruby 方法返回 splat-list 的任何理由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22340345/