散列在散列上
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
。特别是:
Enumerable
)
Array
Hash
Range
IO
和 File
Enumerator
Enumerator::Lazy
(Ruby 2.0)
Set
和 SortedSet
(附加类)
NilClass
MatchData
OpenStruct
Struct
Time
Matrix
和 Vector
所有这些都可以被喷溅:
match, group, next_group = *"Hello, world".match(/(.*), (.*)/)
group # => "Hello"
【讨论】:
Splattednil
在 Ruby 1.9 下消失,这不适合没有效果的情况,所以我猜这是唯一的例外。我说的对吗?
哦,忘了nil
。编辑答案。 NilClass
实现了to_a
(通过返回[]
),所以这不是特例。没有效果意味着[*nil]
将是[nil]
而不是[]
以上是关于散列在散列上的主要内容,如果未能解决你的问题,请参考以下文章
如何纠正 TypeError:Unicode 对象必须在散列之前进行编码?
GDAX / Coinbase API 身份验证过程:Unicode 对象必须在散列之前进行编码