如何将ruby整数转换为符号

时间:2011-01-17 16:34:56

标签: ruby

我有像这样的Ruby数组

q_id = [1,2,3,4,5,...,100]

我想遍历数组并转换为像这样的哈希

{
  :1 => { #some hash} ,  
  :2 => { #another hash},
  ...
  :100 => {#yet another hash}
}

实现这一目标的最短和最优雅的方法是什么?

[编辑:方便的to_s.to_sym不是我想要的。抱歉不提及它。]

8 个答案:

答案 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.to_s.to_sym

但这会产生符号:“1”

答案 5 :(得分:0)

实际上“符号数字”不是Ruby中的东西(尝试在数字上调用to_sym方法)。在哈希中使用符号的好处是关于性能,因为它们总是具有相同的object_id(尝试在字符串,布尔值,数字和符号上调用object_id

数字是立即值,与Symbol对象一样,它们总是具有相同的object_id。

无论如何,使用新的哈希语法意味着使用符号作为键,但你总是可以使用旧的好“哈希火箭”语法

awesome_hash = { 1 => "hello", 2 => "my friend" }

在此处阅读立即值:

https://books.google.de/books?id=jcUbTcr5XWwC&pg=PA73&lpg=PA73&dq=immediate+values+singleton+method&source=bl&ots=fIFlAe8xjy&sig=j7WgTA1Cft0WrHwq40YdTA50wk0&hl=en&sa=X&ei=0kHSUKCVB-bW0gHRxoHQAg&redir_esc=y#v=onepage&q&f=false

答案 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