Una razón por la cual es confuso el tema de los accesors en es que usando Rails y ActiveRecords, te los pone los accesor a los fields automáticamente cuando los declarás en el migration, y en ese caso, llamar a self.safd y @safd es lo mismo?
El 25 de noviembre de 2009 11:30, Maximiliano Guzman < [email protected]> escribió: > eeh, soy Maximiliano, no Gustavo :-) y si, si el método no existe, el > mensaje no va a ningun lado (para ser mas preciso, va a method_missing). Tal > vez se entendió que por alguna razón toda variable de instancia tiene sus > propios accesores. No era la idea. La idea era explicar cual es la > diferencia entre la llamada via self y la llamada con @ en un contexto en > que ambos devuelven un resultado; o sea en un caso en que el accesor está > definido, como por ejemplo una columna en una clase active record. > > saludos, Maximiliano > > 2009/11/25 Gaston Ramos <[email protected]> > > El Wed, 25 de Nov de 2009, a las 12:07:29AM -0300, Maximiliano Guzman dijo: >> > 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 >> >> Hola Gustavo, en tu mail anterior vos dijiste que self.zaraza llama al >> método >> accesor, esto solamente ocurre si declarás el accesor mediante uno de los >> atajos >> que ruby trae para hacerlo (attr_accessor por ej.) o lo declarás vos: >> >> def zaraza >> @zaraza >> end >> >> si vos no hacés hacés ninguna de las dos cosas el método zaraza no existe >> >> class Foo >> def initialize >> @zaraza = "fruta" >> end >> end >> => nil >> >> Foo.new.zaraza >> NoMethodError: undefined method `zaraza' for #<Foo:0x7f5fb9588d68 >> @zaraza="fruta"> >> from (irb):9 >> >> Creo que eso es lo que Nicolás dice y que vos estabas confundido, por >> defecto >> todas las variables de instancia son privadas en Ruby, la forma de >> hacerlas >> públicas es declarando un accesor con cualquiera de las formas conocidas, >> Yo también me confundía con esto hace un tiempo atrás, no sé por qué, por >> que no >> es nada complicado. >> >> Saludos. >> >> > 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]> >> <leonardogallucci%[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 >> >> >> -- >> > > > _______________________________________________ > 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
