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

Responder a