在
Ruby语言源代码
lib/fileutils.rb
中,方法mkdir_p在简化时看起来像这样:
def mkdir_p(list,options={}) return *list if options[:noop] # ... return *list end
根据我对Ruby和测试的理解,这里没有任何意义.是否有任何边缘情况会有所不同?
相关地,如果没有边缘情况,这会对输出产生影响,那么splat是完全无害的还是会导致任何Ruby解释器执行额外的(不必要的)工作?
解决方法
返回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
另一个区别是splat运算符会将nil强制转换为空数组,并且它会将其他(非数组/枚举数)值强制转换为一个元素的数组 – 同样,在所有情况下都会返回一个新数组.
r = x(nil) # r -> [] s = x("one") # s -> ['one']
因此,使用return * l具有微妙的含义,希望这些含义很好地被方法文档覆盖,或者在使用中“毫不奇怪”.