ruby - Splat 在哈希上

标签 ruby hash ruby-1.9 null splat

  • 散列上的 splat 将其转换为数组。

    [*{foo: :bar}] # => [[:foo, :bar]]

    这里是否存在某种隐藏机制(例如隐式类转换),或者它是一种内置的原始特征?

  • 除了数组,nil 和 hash 是唯一在 Ruby 1.9 下随 splat 运算符消失/改变的东西吗?

最佳答案

splat 将尝试将对象显式转换为数组。

为此,它将发送 to_a 并期望得到一个 Array

class Foo
  def to_a
    [1,2,3]
  end
end

a, b, c = *Foo.new
a # => 1

如果对象不响应to_a,则没有效果,例如[*42] == [42]

许多内置类实现to_a。特别是:

  • (因为它们包括 Enumerable)
    • 数组
    • 哈希
    • 范围
    • IOFile
    • 枚举器
    • Enumerator::Lazy (Ruby 2.0)
    • SetSortedSet
  • (附加类(class))
    • NilClass
    • 匹配数据
    • OpenStruct
    • 结构
    • 时间
    • 矩阵向量

因此,所有这些都可以展开:

match, group, next_group = *"Hello, world".match(/(.*), (.*)/)
group # => "Hello"

关于ruby - Splat 在哈希上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14303499/

相关文章:

hash - 使用 UTF-8 字符更正 SHA256 实现

ruby - 我怎么知道一个方法传递给一个 block 的参数有多少?

ruby - 如何查看对象类中的所有方法/属性

ruby-on-rails - rails 中的嵌套表单 - 在 has_many 关系中访问属性

ruby - ruby 的多维数组越界行为是否一致?

arrays - 如何在没有循环的情况下初始化哈希值?

ruby - ruby 1.9 中有没有办法从字符串中删除无效的字节序列?

ruby - Rails 3.2 遍历数组

ruby-on-rails - Ruby on Rails : alias_method_chain, 究竟是做什么的?

hash - Docker如何计算每一层的hash?它是确定性的吗?