2011-04-05 52 views
6

Soy nuevo en Ruby y estoy tratando de resolver algo que me confunde. Al escribir un analizador simple, me encontré con que comparar un char con un == produciría un resultado diferente que comparándola con una expresión case:¿Diferencia entre == y caso?

File.open('Quote.txt') do |f| 
    f.chars.each do |c| 
    puts c == '"' ? 'Quote' : 'Err' 

    puts case c 
    when '"' then 'QuoteCase' 
    else   'ErrCase' 
    end 

    p c == '"', c === '"', c 
    end 
end 

Suponiendo Quote.txt es un archivo de 1 byte que contiene un carácter de comilla simple (0x22), esto produce:

Quote 
ErrCase 
true 
true 
"\"" 

Asumo que he hecho algo mal, pero no puedo averiguar lo que es. ¿Alguien puede ayudar?

Esto está en Ruby 1.9.2, por cierto.

+0

¿Cuál es el tipo de c? ¿Y cuál es el tipo de "\" "? ¿Funciona' c === "\" "'? –

+0

Cadena, Cadena y sí, en ese orden. – Fuz

+0

Me tomé la libertad de hacer que el código fuera un poco más Rubyish (todas esas barras invertidas me hicieron sangrar los ojos :-)) y agregué algunas depuraciones. –

Respuesta

2

Parece un error en YARV en las ventanas. Obtuve la salida correcta en JRuby 1.6.0:

# ruby -v 
ruby 1.9.2p180 (2011-02-18) [i386-mingw32] 

# ruby test.rb 
Quote 
ErrCase 
true 
true 
"\"" 

# jruby --1.9 -v 
jruby 1.6.0 (ruby 1.9.2 patchlevel 136) (2011-03-15 f3b6154) (Java HotSpot(TM) Client VM 1.7.0-ea) [Windows XP-x86-java] 

# jruby --1.9 test.rb 
Quote 
QuoteCase 
true 
true 
"\"" 
+0

Ah, estoy usando MRI p136 - tal vez hubo una regresión. – Skilldrick

+0

ruby ​​1.9.2p136 (2010-12-25 revisión 30365) [i686-linux] da la salida correcta – steenslag

+0

¿Alguien puede presentar un informe de error? –

3

case utiliza el triple-equal === operator para verificar cada caso.

Dicho esto, no sé por qué su ejemplo no está funcionando:

> c = "\"" 
> c == "\"" 
=> true 
> c === "\"" 
=> true 

Retire el c.each y establecer explícitamente al carácter de comillas y ver qué pasa.

En general, === es más tolerante que == en Ruby, así que no puedo imaginar un caso en el que coincidiría con == y === no lo haría.

Editar: yo sólo he copiado el código, con la misma entrada (un archivo con un solo carácter ") y obtuvo el siguiente resultado:

Quote 
QuoteCase 
Err 
ErrCase 

(los dos últimos son de la nueva línea al final del archivo en el que Vim insiste).

+0

Si agrego una línea 'c =" \ "" if c === "\" "' al principio del bloque, funciona como se esperaba.Además, si realizo la misma operación con cada_char en una cadena que contiene un carácter de comilla simple, en lugar de leer de un archivo, funciona como se esperaba. Parece un error (bastante fundamental). – Fuz

+0

Acabo de probar esto y no tuve problemas. No estoy seguro de por qué está recibiendo este error. – Skilldrick

+0

Parece ser un error solo de Windows –

Cuestiones relacionadas