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
