散列在散列上

Posted

技术标签:

【中文标题】散列在散列上【英文标题】:Splat on a hash 【发布时间】:2012-12-27 12:44:13 【问题描述】:

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

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

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

除了数组之外,nil 和散列是唯一在 Ruby 1.9 下使用 splat 运算符消失/更改的东西吗?

【问题讨论】:

【参考方案1】:

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。特别是:

(因为它们包括EnumerableArray Hash Range IOFile Enumerator Enumerator::Lazy (Ruby 2.0) SetSortedSet (附加类) NilClass MatchData OpenStruct Struct Time MatrixVector

所有这些都可以被喷溅:

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

【讨论】:

Splatted nil 在 Ruby 1.9 下消失,这不适合没有效果的情况,所以我猜这是唯一的例外。我说的对吗? 哦,忘了nil。编辑答案。 NilClass 实现了to_a(通过返回[]),所以这不是特例。没有效果意味着[*nil] 将是[nil] 而不是[]

以上是关于散列在散列上的主要内容,如果未能解决你的问题,请参考以下文章

如何纠正 TypeError:Unicode 对象必须在散列之前进行编码?

在散列之前加扰加盐密码。好主意?

GDAX / Coinbase API 身份验证过程:Unicode 对象必须在散列之前进行编码

Azure Synapse Analytics:我可以在散列分布式表中使用非唯一列作为散列列吗?

数据结构-散列查找

使用散列在 3sum 问题中获取重复项