ruby - Ruby 方法返回 splat-list 的任何理由?

标签 ruby syntax

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

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

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

相关地,如果不存在这会影响输出的边缘情况,splat 是完全无害的还是会导致任何 Ruby 解释器执行额外(不必要的)工作?

最佳答案

return lreturn *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/

相关文章:

ruby-on-rails - 使用 Moneris Canada 在活跃商家中定期计费

ruby-on-rails - 如何配置支持 ES6 的 Rails 应用程序

syntax - TypeScript 构造函数 - 环境上下文错误

java - Java 中的 transient

ruby-on-rails - 如何在不使用参数的情况下添加删除数据的按钮?

ruby-on-rails - 如何为 after_save 创建的对象返回验证错误?

javascript - 解释 API 函数签名语法

mysql - mysql查询的where子句中的问题

java - AES 128 CFB、Java/BouncyCaSTLe 与 Ruby/OpenSSL

java - if(something || someElse || someElse2 || someElse3 ...) 的替代方法