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]>
> > >:
> > >> > 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