我有像这样的Ruby数组
q_id = [1,2,3,4,5,...,100]
我想遍历数组并转换为像这样的哈希
{
:1 => { #some hash} ,
:2 => { #another hash},
...
:100 => {#yet another hash}
}
实现这一目标的最短和最优雅的方法是什么?
[编辑:方便的to_s.to_sym不是我想要的。抱歉不提及它。]
答案 0 :(得分:28)
要创建符号,请执行以下任一操作:
42.to_s.to_sym
:"#{42}"
这些节目的#inspect
表示只显示:"42"
,因为:42
不是有效的符号字面值。请放心,双引号不是符号本身的一部分。
要创建哈希,没有理由将密钥转换为符号。你应该这样做:
q_id = (1..100).to_a
my_hash_indexed_by_value = {}
q_id.each{ |val| my_hash_indexed_by_value[val] = {} }
或者这个:
my_hash = Hash[ *q_id.map{ |v| [v,{}] }.flatten ]
或者这个:
# Every time a previously-absent key is indexed, assign and return a new hash
my_hash = Hash.new{ |h,val| h[val] = {} }
使用所有这些,您可以直接使用整数索引哈希并获得唯一的哈希值,例如
my_hash[42][:foo] = "bar"
与JavaScript不同,其中对象的每个键都必须是一个字符串,Ruby中的Hashes接受任何对象作为键。
答案 1 :(得分:3)
要将整数转换为符号,请使用to_s.to_sym
..例如:
1.to_s.to_sym
请注意,符号与字符串的关系比整数更多。它可能不再像排序那样有用。
答案 2 :(得分:1)
如前所述,:1不是有效符号。这是一种方法来做你想要的,但把键作为字符串:
Hash[a.collect{|n| [n.to_s, {}] }]
答案 3 :(得分:1)
哈希中你想要的对象数组会更容易使用,不是吗?即使是整数的哈希也能很好地工作,不是吗?
答案 4 :(得分:0)
但这会产生符号:“1”
答案 5 :(得分:0)
实际上“符号数字”不是Ruby中的东西(尝试在数字上调用to_sym
方法)。在哈希中使用符号的好处是关于性能,因为它们总是具有相同的object_id
(尝试在字符串,布尔值,数字和符号上调用object_id
。
数字是立即值,与Symbol对象一样,它们总是具有相同的object_id。
无论如何,使用新的哈希语法意味着使用符号作为键,但你总是可以使用旧的好“哈希火箭”语法
awesome_hash = { 1 => "hello", 2 => "my friend" }
在此处阅读立即值:
答案 6 :(得分:0)
如果要创建硬编码的常量数字符号,则有一种更简单的方法:
:'99'
这会产生与其他答案中更复杂的方法相同的结果:
irb(main):001:0> :'99'
=> :"99"
irb(main):002:0> :"#{99}"
=> :"99"
irb(main):003:0> 99.to_s.to_sym
=> :"99"
当然,如果您是根据变量动态创建符号,则这种方法将不起作用,在这种情况下,需要使用其他两种方法之一。
答案 7 :(得分:0)
您可以使用Hash[]
来创建符号键:
a = Hash[(1..100).map{ |x| ["#{x}".to_sym, {}] }]
检查哈希键的类型:
puts a.keys.map(&:class)
=>
Symbol
...
Symbol
Symbol