El último y me voy a cocinar. Revisen regex.c, línea 2215 en adelante:

...
    case '\\':
      if (p == pend)
....

y línea 2398 en adelante:
....
    numeric_char:
      nextp = p + mbclen(c) - 1;
....

Se hace algo en especial en los casos numéricos, no me da el tiempo
para fijarme ahora que exactamente, pero dejo las líneas para que
alguien lo haga si le interesa. Probablemente no se encuentre ahí el
problema final, pero sería interesante ver bien que pasa en ese caso.
Después habría que revisar la función de matcheo (o las? me parece que
hay más de una, el código es horrible) que es donde se modifica el
objeto regexp de manera que el hash ya no es el mismo.

Ciao.

2009/7/10 Bruno Deferrari <[email protected]>:
> Ja...y esta?
>
>
> irb(main):034:0> r = /\141/
> => /\141/
> irb(main):035:0> r.hash
> => 473091087
> irb(main):036:0> r =~ "a"
> => 0
> irb(main):037:0> r.hash
> => -1048226273
>
> 141 es ASCII (es la letra 'a'), aún así tiene el mismo problema. Me
> parece que no viene por el lado del encoding la cosa, es un tema de
> usar valores octales y hexadecimales en vez de caracteres.
>
> (sorry por el multi-mensaje)
>
> 2009/7/10 Bruno Deferrari <[email protected]>:
>> Otra más:
>>
>>> res = [/\xc3\x81/, /\303\201/, /Á/]
>> => [/\xc3\x81/, /\303\201/, /\303\201/]
>>> res.map &:hash
>> => [527397363, -279873034, 141541]
>>> res.each {|re| re =~ "hola"}
>> => [/\xc3\x81/, /\303\201/, /\303\201/]
>>> res.map &:hash
>> => [404259843, -403010554, 141541]
>>
>> y
>>
>> irb(main):014:0> res = [/\xc3\x81/u, /\303\201/u, /Á/u]
>> => [/\xc3\x81/u, /\303\201/u, /\303\201/u]
>>> res.map &:hash
>> => [527397363, -279873034, 429037]
>>> res.each {|re| re =~ "hola"}
>> => [/\xc3\x81/u, /\303\201/u, /\303\201/u]
>>> res.map &:hash
>> => [404259843, -403010554, 429037]
>>
>> Solo la versión con 'Á' cambia de hash al usar 'u' como modificador.
>>
>> 2009/7/10 Bruno Deferrari <[email protected]>:
>>> 2009/7/10 Pablo Herrero <[email protected]>:
>>>> Lo unico que creo q deberia de considerase bug es que /\303\200/u != /À/u
>>>
>>> Mirate esto:
>>>
>>> irb(main):001:0> [/\303\201/.source, /Á/.source]
>>> => ["\\303\\201", "\303\201"]
>>>
>>> La documentación dice:
>>> "Equality—Two regexps are equal if their patterns are identical, they
>>> have the same character set code, and their casefold? values are the
>>> same."
>>>
>>> Mi pregunta es, deberían considerarse idénticos (que no es lo mismo
>>> que equivalentes) esos 2 patrones?
>>>
>>
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a