2012-04-16 27 views
8

Acabo de encontrar un problema extraño en el lenguaje de programación ruby, no es un gran problema, pero simplemente no puedo entender por qué sucede. Me interesaría si alguien conoce el problema de mi problema.¿No es 00.0 lo mismo que 0.0?

En ruby ​​puede escribir 0 o 00, eso no importa, se trata del mismo resultado.
Si ejecuta 0 === 00, también obtiene true, lo que significa que las dos entradas son exactamente iguales.

0.0 es igual también 0, por lo que lógicamente también debe 00.0 igual 0.0 pero el problema es, que si se intenta utilizar el número 00.0 a continuación, sólo obtendrá un error. Si ejecuta por ejemplo:

a = 00.0 

obtiene este error:

syntax error, unexpected tINTEGER

Por supuesto sé que esto es un pequeño problema, pero como se ha dicho que me gustaría entender por qué el equipo no lo hace tratar 00.0 lo mismo que 0.0?

+0

¿Es 00.0 matemáticamente legítimo? – texasbruce

+4

Es _mathematically_ legítimo. La pregunta es si es legítimo en ruby. – Anthales

+1

Haré solo un comentario, ya que no tengo una base concreta para esto. Una idea, sin embargo, es que quizás Ruby evalúe 0 === 00 en un nivel de bit, pero una vez que se agrega un decimal, la evaluación se realiza como flotantes. En ese punto 00.0 no es una entrada de fiar y probablemente no será igual a nada, creo. – Colleen

Respuesta

4

El problema es que cuando el análisis y el rubí determinan que un número con más de dos dígitos comienza con el carácter 0, lo analiza como un número entero octal. Por lo tanto, cuando analiza 00, es 0 en octal que es lo mismo que 0 en decimal. Pero si encuentra un. entonces es un entero inválido y ese es el error que muestra.

+0

En realidad, la parte '00' todavía está bien, Ruby lo está tratando como una invocación de método en el objeto Fixnum (singleton)' 0', y espera un símbolo válido para el nombre del método después del período. Por ejemplo, '00.class # => Fixnum'. Sin embargo, dado que el último '0' no es un símbolo válido, es un error de sintaxis. De ahí el mensaje de error (El mensaje de error provisto por el OP tiene más sentido que 'SyntaxError: no. literal flotante más puesto 0 antes del punto'). –

1

me trataron "a = 00.0" en http://tryruby.com, y tiene:

SyntaxError: no .<digit> floating literal anymore put 0 before dot. near line 1: "" 

Es evidente que el analizador léxico Ruby no está contando con esa forma de flotador.

Cuestiones relacionadas