2013-12-13 32 views
0

我刚开始红宝石昨天学习,在Codeacademy“串不能强迫Fixnum对象”,同时在使用过程中的数据结构的一部分,我试过如下:红宝石:打印哈希对时

my_hash = {1=>2,3=>4,"5"=>"6"} 
my_hash[7] = my_hash[1]+my_hash[3] 
my_hash.each { |k,v| 
# Here I want to print key and values like "Key: Value" 
} 

在第4行,

这工作:

puts "#{k}: #{v}" 

这不:

puts k+": "+v  

我得到String can't be coerced into Fixnum。 为什么?我只是打印字典键和值。我不会在其他任何东西中进行类型转换。有什么问题?

+0

因为你的第一个散列的k,v是1 => 2,意味着k,v class是一个Fixnum,所以不能加上“:”这是一个字符串,ruby不接受这个。 我认为使用'“#{k}:#{v}”是最好的解决方案,或者您可以使用'k.to_s +“:”+ v.to_s'来代替。 –

+0

是啊!我只是做了===>'puts k.to_s +“:”+ v.to_s' 我猜在Ruby中,'+'并不意味着串联,如果在打印语句中使用了一个数字。 –

+1

没错!还有一件事:'to_s'是'Class'类的方法,所以每个变量都有这个函数,甚至是'nil',所以随意使用它。 –

回答

1

更正以下Chuck的评论。

这个问题确实是你没有类型化。在第一次迭代中,您通过k1,这是一个fixnum。为了做+1+的参数也必须是一个数字,但你给了": ",这是一个字符串。这就是你做错了什么。如果你想做+作为字符串,你必须在1上做类型转换,比如通过做1.to_s(这是"#{1}"在你的第一个版本中做的)。

+1

小小挑逗:参数可以是任何标准的数字类型。它可能是一个Fixnum,Float,Rational,BigDecimal等等。 – Chuck