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

Responder a