加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:08:23 所属栏目:百科 来源:网络整理
导读:在 Ruby语言源代码 lib/fileutils.rb 中,方法mkdir_p在简化时看起来像这样: def mkdir_p(list,options={}) return *list if options[:noop] # ... return *listend 根据我对Ruby和测试的理解,这里没有任何意义.是否有任何边缘情况会有所不同? 相关地,如果
在 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具有微妙的含义,希望这些含义很好地被方法文档覆盖,或者在使用中“毫不奇怪”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读