Hola,
lo más que pude reducir el código y que siga mostrando el problema es esto:

irb(main):028:0> r1 =
/([A-Za-z0-9]|\303[\200-\277])*(_([A-Za-z0-9]|\303[\200-\277])+)+/
=> /([A-Za-z0-9]|\303[\200-\277])*(_([A-Za-z0-9]|\303[\200-\277])+)+/
irb(main):029:0> r2 =
/([A-Za-z0-9]|\303[\200-\277])*(_([A-Za-z0-9]|\303[\200-\277])+)+/
=> /([A-Za-z0-9]|\303[\200-\277])*(_([A-Za-z0-9]|\303[\200-\277])+)+/
irb(main):030:0> r1.eql? r2
=> true
irb(main):031:0> r1.hash
=> -455124409
irb(main):032:0> r2.hash
=> -455124409
irb(main):033:0> r1.match "hola"
=> nil
irb(main):034:0> r1.hash
=> -471344041
irb(main):035:0> r2.hash
=> -455124409
irb(main):036:0> r1.eql? r2
=> false

Fíjense que cambia el hash de r1 después de matchear y también deja de
ser cierto r1.eql? r2.

Aureliano.

PD: /([A-Za-z0-9]|\303[\200-\277])/ son todas las letras (incluyendo
las acentuadas en un montón de lenguajes, como el castellano).
2009/7/7 Pablo Herrero <[email protected]>:
> Si, evidentemente, es un error de Ruby, incluso en el codigo de
> 'eql?', se ve lo siguiente:
>
>   if (memcmp(RREGEXP(re1)->str, RREGEXP(re2)->str, RREGEXP(re1)->len) == 0 &&
>        rb_reg_cur_kcode(re1) == rb_reg_cur_kcode(re2) &&
>        RREGEXP(re1)->ptr->options == RREGEXP(re2)->ptr->options) {
>        return Qtrue;
>    }
>    return Qfalse;
>
> Es decir compara directamente la igualdad de options, cuando en la
> documentacion dice, q hay bits de este campo q son de uso interno,
> i.e., estan fuera del control del usuario.
>
> Lo q yo planteaba es q tal vez esto podia solucionarse, en lugar de
> remplazar eql? (q depaso habria q hacer lo mismo con Regexp#hash),
> buscar algun otro workaround, como pasar /\d+/.freeze() , por ejemplo,
> para evitar generarse algun problema nuevo debido a que algún otro
> codigo o libreria se base en el comportamiento por defecto de
> Regexp#eql?.
>
> De todas formas estaria interesante q Aureliano postee el codigo donde
> aparece el problema.
>
> El 7 de julio de 2009 10:02, Rodrigo Dominguez<[email protected]> escribió:
>> Yo creo que su solución, si bien fue la menos esperada, fue la mas obvia.
>>
>> Tenía problemas porque la key a veces no la encontraba, cuando en realidad
>> estaba ahí, implemento su propio eql? para realmente encontrar la key cuando
>> corresponde, y el mismo código le anda perfecto, o sea que la solución que
>> planteo, si bien era la menos esperada (porque uno podría llegar a pensar
>> que hay un error lógico de uno mismo antes que un comportamiento no esperado
>> de ruby) es la idónea.
>>
> _______________________________________________
> Ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a