2012-03-13 96 views
26

我正在试验数组,并且正在阅读Steve Holzner的书“Beginning Ruby on Rails”。我制作的节目:Array TypeError:无法将Fixnum转换为字符串

array = ['Hello', 'there', 1, 2] 
puts array[1] 
puts array[3] 
puts array.length 
array2 = Array.new 
puts array2.length 
array2[0] = "Banana" 
array2[1] = 6 
puts array2[0] + " " + array2[1] 
puts array3.length 

它没有做太多,但是当我运行它,我得到的错误

arrays.rb:9:in `+': can't convert Fixnum into String (TypeError) 
    from arrays.rb:9 

为什么会出现这个错误?

回答

50

您不能添加字符串和整数(Fixnum),在这种情况下您尝试将6添加到“香蕉”。

如果在第9行,你这样做:

puts array2[0] + " " + array2[1].to_s 

你会得到:

"Banana 6" 
+2

打败我秒。 :) – 2012-03-13 03:26:57

+1

我想在这里添加一个错误是强类型语言的一个特性,其中Ruby就是一个例子。 PHP是一种弱类型语言,它会允许这种欺骗行为。 – bernie 2012-03-13 03:30:22

+3

@bernie它更多的是Ruby类型强制规则的直接结果,而不是它的强类型。例如,Ruby中的Float + Fixnum是合法的,因为Ruby知道如何强制一种类型到另一种类型。你实际上可以重新打开Fixnum并添加一个'coerce'方法,这个方法也会使String + Fixnum合法。 – 2012-06-14 16:58:15

4

array2[1]6,这是一个Fixnum。它不知道如何将自身添加到字符串(在这种情况下是Banana。如果你把它转换成字符串,它会工作得很好。

puts array2[0] + " " + array2[1].to_s 
3

误差基本上是说你不能转换array2[1](该值是一个数字,一个类型Fixnum对象在这种情况下)为字符串类型。你会解决这个问题的方法是将类型转换为字符串(这是第9行,其中错误发生):

puts array2[0] + " " + array2[1].to_s 

array2 [1]。 to_s将数字转换为字符串类型。

1

还没有尝试过这个自己,但尝试

puts array2[0] + " " + array2[1].to_s 
+0

array2 [0]已经是一个字符串类型,你想转换元素1(array2 [1]),因为它拥有“6” – 2012-03-13 03:29:08

+0

@Kevin Jalbert是的,我看到它。谢谢! – 2012-03-13 03:30:11

+0

没问题,只是指出来(很高兴你也抓到了它)。 – 2012-03-13 03:31:51

0

这里更换

puts array2[0] + " " + array2[1] 

是一种方法,一个Fixnum表达式转换成字符串,

x=2 
print (x+20).to_s + "\sbanannas" 

没不知道你可以使用FixnNum#to_s方法来处理那些parens。

相关问题