2010/4/21 Cristhian Boujon <[email protected]>:
> Buenas gente,
>
> Les cuento que soy nuevo en Ruby y en RoR también. Jugando un poco con RoR,
> se me ocurrió hacer lo siguiente para ver como trabajaba con los objetos:
>
>>> p = Product.find(2)
>
>>> p1 = Product.find(2)
>
>>> p == p1
> p == p1
> => true
>
>>> p.title
> p.title
> => "Pragmatic Project Automation"
>
>>> p.title = "hola"
> p.title = "hola"
> => "hola"
>
>>> p == p1
> p == p1
> => true
>
>>> p1.title
> p1.title
> => "Pragmatic Project Automation"
>
> Sorpresa! y no tanta. Resulta que siempre se me devuelven distintas
> instancias. Y la comparación es por un id y no por referencia.

En Ruby podés definir tu propio operador de comparación y eso es lo
que está haciendo ActiveRecord. Tiene sentido hacer que el operador ==
sea una comparación sensible al tipo que estás comparando. De hecho:

>> "hello".object_id == "hello".object_id
=> false
>> "hello" == "hello"
=> true

Si realmente querés comparar si son el mismo objeto:

>> "hello".equal? "hello"
=> false

> En la Teoría, los objetos tienen una identidad propia que es implementada
> con referencias al mismo sitio de memoria, de esta forma, el cambio se
> realiza una vez y no hay inconsistencias.

En la práctica resulta práctico que la comparación sea según el ID. Por ejemplo:

user = User.find(1)
another_user.friends.include?(user)

Además, esa igualdad tiene que ser respetada por el método #hash:

users = {User.find(1) => true}

>> users[User.find(2)]
=> nil

>> users[User.find(1)]
=> #<User...>

Claro que todo esto también andaría si ActiveRecord te estuviese
devolviendo la misma instancia, peeero...

> La pregunta es, por que no se devuelve la misma instancia? cuestiones de
> eficiencia?

Había ideas de implementar el identity map, pero parece que es
demasiado complejo de resolver (imaginate relaciones anidadas, etc.) Y
creo que además 'es para quilombo', en el sentido de que puede
conducir a bugs muy difíciles de encontrar.
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a