Esa forma de definir métodos de clase tiene una lógica, que está bien
explicada en el Pickaxe. Tené en cuenta que un "método de clase" es un
método singleton que se le agrega al objeto  clase...
Métodos singleton son métodos que se le pueden "adosar" a una instancia
particular sin tocar al resto de las instancias de la clase (eso y los
mixins te permiten componer comportamiento de una manera tan simple que
pensar en IoC y otros patrones que usa la gente en Java te parecen
monstruos...).

Por ejemplo

a = 2
> def a.es_par?; self.even?; end
> a.es_par? # => true
> 3.es_par? # NoMethodError!!
>

De manera similar se puede hacer con la clase.

String.class.name # => "Class"
> def String.generar_random; (1..16).map do
> [0,1,2,3,4,5,6,7,8,9,"A","B","C","D","E","F"][(rand*16).to_i] end.join;
> end
> String.generar_random # => un hexa aleatorio


Disculpame el ejemplo rebuscado, me la compliqué sólo...
Acá le agregué un "método de clase" a String... pero en realidad fijate que
"método de clase" y "método de instancia" son lo mismo, no son distintas
construcciones que soporta el lenguaje como casos particulares; el método
"generar_random" es un método de instancia del objeto String (que es
instancia de Class, o sea, es un objeto). Andá a explicarle eso a alguien
que aprendió programación con Java leyendo tutoriales y cree que Smalltalk
es un programa de TV gringo de chimentos (ni hablar que lo aprecie).

Saludos,

Nacho

On 9/12/07, Luis Lavena <[EMAIL PROTECTED]> wrote:
>
> On 9/12/07, Porta <[EMAIL PROTECTED]> wrote:
> > gracias....
> >
> > por si a alguien le interesa, de rebote encontré esto:
> > http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html
> > parece interesante. bastante cerca también de lo que necesito.
> > hasta que llegué a esta linea:
> >  def metaclass; class << self; self; end; end
> >
> > y ahi me perdí. me marean un poco esos punto y coma. y no hablemos de
> class
> > << self;
> >
>
> Jejeje, los punto y coma son de vagancia... ademas de que no hay mucho
> que explayar... es un empty class.
>
> > eso tiene que ver con con herencia?
>
> digamos:
>
> class MyPowerHash < Hash
> end class
>
> Aqui, defino MyPowerHash, que hereda de Hash (posee a hash como
> ancestor y por ende posee la misma funcionalidad de metodos).
>
> Ahora bien, hay dos maneras de definir metodos de clase (esos que
> pueden se llamados desde la clase en si y no una instancia).
>
> Un metodo de instancia es aquel que requiere MyClass.new para poder
> llamarlo.
>
> En cambio, uno definido dentro de class << self (o tambien def self.metodo
> ):
>
> class MyClass < Hash
>   # esto
>   class << self
>     def algo
>     end
>   end
>
>   # es lo mismo que esto
>   def self.algo
>   end
> end
>
> Cuando tenes mas de un metodo de clase, en lugar de escribir todos los
> metodos con 'self.' podes usar class << self.
>
> > alguna lectura recomendada sobre el tema?
> >
>
> Nada como el libro de Programming Ruby por Pragmatic Programmers.
> Sino tambien, the Humble Little Ruby Book.
>
> No tengo los links a mano :-P
>
> --
> Luis Lavena
> Multimedia systems
> -
> Leaders are made, they are not born. They are made by hard effort,
> which is the price which all of us must pay to achieve any goal that
> is worthwhile.
> Vince Lombardi
> _______________________________________________
> 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