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
