如何将ruby整数转换为符号

如何将ruby整数转换为符号,ruby,Ruby,我有一个像这样的Ruby数组 q_id = [1,2,3,4,5,...,100] { :1 => { #some hash} , :2 => { #another hash}, ... :100 => {#yet another hash} } 我想遍历数组并将其转换为如下所示的散列 q_id = [1,2,3,4,5,...,100] { :1 => { #some hash} , :2 => { #another hash

我有一个像这样的Ruby数组

q_id = [1,2,3,4,5,...,100]
{
  :1 => { #some hash} ,  
  :2 => { #another hash},
  ...
  :100 => {#yet another hash}
}
我想遍历数组并将其转换为如下所示的散列

q_id = [1,2,3,4,5,...,100]
{
  :1 => { #some hash} ,  
  :2 => { #another hash},
  ...
  :100 => {#yet another hash}
}
最短最优雅的方法是什么

[编辑:方便时的to_.s.to_sym不是我想要的。抱歉没有提前提到它。]

您可以使用 1.to_.s.to_sym


但这会产生类似于“1”的符号。要将整数转换为符号,请使用
To_s.To_sym
。。e、 g.,:

1.to_s.to_sym

请注意,符号与字符串的关系大于与整数的关系。它可能不再对排序之类的事情有用。

对于创建符号,以下任一工作:

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 = 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不同,JavaScript中对象的每个键都必须是字符串,Ruby中的哈希接受任何对象作为键。

如前所述:1不是有效符号。这里有一种方法可以实现您想要的功能,但可以使用键作为字符串:

Hash[a.collect{|n| [n.to_s, {}] }]

您希望在哈希中使用的对象数组会更容易使用,不是吗?即使是整数的散列也能很好地工作,不是吗?

实际上“符号数字”在Ruby中不是一个东西(试着对数字调用
到\u sym
方法)。在散列中使用符号的好处在于性能,因为它们总是具有相同的
object\u id
(尝试对字符串、布尔值、数字和符号调用
object\u id

数字是立即值,与符号对象一样,它们始终具有相同的对象id

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

awesome\u hash={1=>“你好”,2=>“我的朋友”}

请阅读此处的即时值:


如果要创建硬编码常量数字符号,有一种更简单的方法:

:'99'
这将产生与其他答案中更复杂的方法相同的结果:

irb(main):001:0> :'99'
=> :"99"
irb(main):002:0> :"#{99}"
=> :"99"
irb(main):003:0> 99.to_s.to_sym
=> :"99"

当然,如果要从变量动态创建符号,这将不起作用,在这种情况下,需要另外两种方法之一。

您可以使用
哈希[]
生成符号键:

a=Hash[(1..100).map{x}[“{x}”.to{u-sym,{}]
检查哈希键的类型:

放置a.keys.map(&:class)
=>
象征
...
象征
象征

我认为这是不合法的。尝试在
irb
中键入
:1
,您将得到一个语法错误。如下所述,:1无效。你能得到的最好答案是:“1”。我不确定这为什么如此重要,因为引号并不是符号的真正“一部分”。。但出于解析/语法的原因,它必须被定义。也许你应该向我们展示你真正想要实现的目标。为什么您觉得需要数字作为哈希键的符号?你以后将如何对散列进行索引,或者如果你对它进行迭代,你将如何处理这些键?我试图将下面散列的键转换为可索引整数,并认为:“22”看起来不够干净或优雅。“qs”=>{“22”=>[“56”,“57”],“1”=>[“1”,“2”,“13”,“14”],“2”=>[“3”,“4”,“5”]}我的错是,我忘记了ruby中符号的基本含义,它是字符串的静态表示-javascript效果基本上(正如您正确猜测的那样)是的,正如Andy提到的,我正在寻找一种将其转换为:1而不是:“1”的方法。已经排除了直接到符号的方法,您不能有如下符号:1。符号基本上是一个具有某些特殊属性的字符串。@papdel没有像
:1
这样的符号<代码>:“1”是描述字符串表示为
1
的符号的方式;引号不是符号长度的一部分<代码>:“7”。长度#=>1您不需要符号键,而是需要数字键。看我的答案。同意@Phrogz。我想你真的想坚持使用数字键。谢谢你的详细解释@嗯,是的;我假设将使用一个变量来代替
42
,但我想新来者可能不清楚这一点。谢谢你的澄清。请解释一下你的答案。仅仅添加代码没有帮助。