2012-03-13 31 views
26

Estoy experimentando con matrices, y estoy leyendo el libro "Beginning Ruby on Rails" de Steve Holzner. Hice el programa:Array TypeError: no se puede convertir Fixnum en String

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 

No hace mucho, pero cuando lo ejecuto me sale el error

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

¿Por qué aparece este error?

Respuesta

50

No puede agregar una cadena y un número entero (Fixnum), en este caso intentó agregar 6 a "Banana".

Si en la línea 9 que hizo esto:

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

que se obtendría:

"Banana 6" 
+2

Batirme por segundos. :) –

+1

Agregaría que arrojar un error aquí es una característica de un lenguaje fuertemente tipado, del cual Ruby es un ejemplo. PHP, un lenguaje débilmente tipeado, permitiría tales argucias. – bernie

+3

@bernie Es más un resultado directo de las reglas de coerción de tipo de Ruby, no su fuerte tipado. Por ejemplo, Float + Fixnum en Ruby es legal porque Ruby sabe cómo forzar un tipo al otro. En realidad, podría volver a abrir Fixnum y agregar un método 'coerce' que también haría legal a String + Fixnum. –

4

array2[1] es 6, que es un Fixnum. No sabe cómo sumarse a una cadena (que en este caso es Banana. Si se va a convertir en una cadena, que funcionaría bien.

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

El error es básicamente estás diciendo no puede convertir array2[1] (el valor es un número, un tipo Fixnum en este caso) en un cadena tipo. la forma en que usted evitar esto es para convertir el tipo en una cadena(esto es para la línea 9 en el que el se produce el error):

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

La matriz2 [1]. to_s convierte el número en un tipo de Cadena.

1

no he probado esto por mí mismo, pero intente reemplazar

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

con

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

array2 [0] ya es un tipo de cadena, desea convertir el elemento 1 (matriz2 [1]) ya que contiene el "6" –

+0

@Kevin Jalbert Sí, lo vi. ¡Gracias! –

+0

No hay problema, simplemente señalándolo (me alegro de que lo haya atrapado también). –

0

Aquí es una forma de convertir una expresión Fixnum en una cadena,

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

Didn 't sabe que podría virar en el método FixnNum # to_s a esos parens.

Cuestiones relacionadas