2009/11/24 Maximiliano Guzman <[email protected]>:
> self.zaraza llama al método accesor, mientras que @zaraza accede directo a
> la variable.
>
> por ejemplo:
>
> class Proceso
>
> def duracion
> @duracion+' hs'
> end
>
> def duracion=(val)
> @duracion = val.gsub(' hs','')
> end
> end
>
> puts @duracion
> => "20"
>
> puts self.duracion
> => "20 hs"
ehhhh no. Eso está mal. Es cualquiera. Yo estoy re dormido, pero ese
código no tiene sentido (no estoy tan dormido como no darme cuenta de
que eso rima–o quizás estoy suficientemente dormido como para que me
llame la atención que rime) pero como sea, ese ejemplo es cualquiera,
por lo menos correlo en irb antes
Basicamente:
@nombre accede a la variable de instancia "nombre" guardada en self.
self.nombre llama al metodo "nombre" en self. Podés hacer que el
método nombre retorne @nombre, pero podría hacer otra cosa también.
Las variables de instancia *NUNCA* estan en "self.blah"
Cuando vos definis accesores en una clase, o sea, cuando hacés esto:
class Foo
attr_reader :blah
attr_writer :foo
attr_accessor :cuack
end
lo que pasa es, *básicamente*, lo mismo que si escribieras esto:
class Foo
def blah
@blah
end
def foo=(value)
@foo = value
end
def cuack
@cuack
end
def cuack=(value)
@cuack = value
end
end
O sea, no es que "definas variables de instancia que se acceden como
self.cuack", sino que definis metodos que manejan las variables de
instancia por vos.
Básicamente, las variables de instancia son siempre *privadas* (o sea,
solo podés acceder desde el contexto de self), para accederlas desde
afuera necesitás métodos que te permitan hacerlo (como cuack y cuack=
en el ejemplo arriba, u otros métodos que tiene ruby para eso)
Lo que te recomiendo (y a cualquiera que tenga dudas de cómo funciona
esto, en particular de qué es self y "a dónde apunta?", que vea los
screencasts de PragmaticProgrammers sobre el modelo de objetos de
ruby, son bástante claros, y son baratos (7 episodios a 5 dolares cada
uno—http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming)
Esos explican bástante bien cómo funciona todo.
Y me fui a dormir
-foca
> cuando hacés
> @duracion = '10 hs'
>
> la variable @duracion queda con el valor '10'
>
> en cambio, cuando haces
> self.duracion = '10 hs'
>
> la variable @duracion queda con el valor '10 hs', porque se la está
> accediendo directamente.
>
> o sea, que cuando llamas con @duracion te estás salteando el método getter y
> cuando haces @duracion= te estas salteando el setter.
>
> cuando usas attr_accessor para declarar atributos, attr_accessor crea estos
> métodos getter y setter <i>on the fly</i>, y lo mismo pasa con las columnas
> de las clases ActiveRecord en Rails.
>
> saludos, Maximiliano
>
>
> 2009/11/24 Bruno Deferrari <[email protected]>
>>
>> 2009/11/24 Leonardo Gallucci <[email protected]>:
>> > Gente,
>> >
>> > Alguien sabe con seguridad a nivel Ruby language cual es la diferencia
>> > entre
>> > usar @instance_var contra self.instance_var ?
>> >
>> >
>> > gracias,
>> > --
>> > Leonardo Gallucci
>> > Developer at Delapalo Labs
>> > http://twitter.com/leonardog (@leonardog)
>> > http://delicious.com/leonardogallucci
>> >
>> >
>> > _______________________________________________
>> > Ruby mailing list
>> > [email protected]
>> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>> >
>> >
>>
>> @instance_var referencia a la variable de la instancia,
>> self.instance_var le manda el mensaje 'instance_var' a self.
>> _______________________________________________
>> 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
>
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar