Nicolás, estoy muy de acuerdo en todo lo que escribiste excepto en un detalle: estamos diciendo lo mismo. Leelo de vuelta, y en todo caso si hay algo que estoy pasando por alto por favor detallalo. Y no, claro mi código no corre en irb, porque las llamadas a self van a ir a parar a cualquier lado. La idea es que si ese código self.zaraza es puesto en algun método de instancia de la clase Persona, entonces si va a andar. En todo lo demás, como lo de que un accessor no es lo mismo que una variable de instancia, y que estas son privadas estoy 100% de acuerdo.
2009/11/24 Nicolás Sanguinetti <[email protected]> > 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]<leonardogallucci%[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
