=?iso-8859-1?q?M=E9todos_Self?=

Hola Amigos,
Aunque llevo unos meses aprendiendo Rails y leyendo atentamente todos
los
hilos que van saliendo, quería realizar una consulta:

Cuando a un método de una clase se le antepone “Self.”, ¿Que quiere
decir
esto? ¿Cual es la diferencia deno ponerselo. Por que la diferencia entre
metodos públicos y privados, creo que más o menos la entiendo, ¿pero
“Self”?

Un saludo a todos y gracias de antemano…

On 12/1/06, Fernando V. [email protected] wrote:

Hola Amigos,
Aunque llevo unos meses aprendiendo Rails y leyendo atentamente todos los
hilos que van saliendo, quería realizar una consulta:

Cuando a un método de una clase se le antepone “Self.”, ¿Que quiere decir
esto? ¿Cual es la diferencia deno ponerselo. Por que la diferencia entre
metodos públicos y privados, creo que más o menos la entiendo, ¿pero “Self”?

Es un método estático o de clase.
Por ejemplo el método find de ActiveRecord. Tú usas:

@result = Model.find(:first)

Pero no haces:

@result.find(… lo que sea

Un saludo.

Un saludo a todos y gracias de antemano…

Disculpa, pero no lo pillo (es que soy diseñador y aún estoy “tierno”
con
Rails…

2006/12/1, Rodrigo A. Fernández [email protected]:

Si lo haces al definir el método quiere decir que va a ser un método de
clase, y no de instancia. Es decir, que lo puedes invocar directamente
sin necesidad de tener que instanciar un objeto de esa clase previamente
(sin hacer un new).

En lugar de self, podrías usar directamente el nombre de la clase, pero
lo de self es más cómodo muchas veces porque son cuatro letras y además
luego hace más sencillo buscar en el código de forma genérica. Las
definiciones que te pongo debajo son equivalentes

class MiClase
def self.UnMetodo
end
end

class MiClase
def MiClase.UnMetodo
end
end

En los dos casos, para invocar al método tienes que hacer
“MiClase.UnMetodo”. Y en los dos casos si haces “my_obj = MiClase.new;
my_obj.UnMetodo” te dará un error, porque no puedes invocar al método
como método de la instancia.

En cuanto a su uso, es lo que haces, por ejemplo, al hacer
NombreDeMiModelo.find(x). Si te das cuenta, eso funciona sin tener que
previamente instanciar una clase de tu modelo.

Si vienes de otros lenguajes de programación, te puede sonar quizás como
un método estático

Si por el contrario, el self lo tienes en una llamada, y no en una
definición, significa que quieres llamar al método de tu clase que se
llama de esa forma, y suele utilizarse sobre todo para evitar
ambigüedad.

saludos,

j

On Dec 1, 2006, at 11:48 AM, Fernando V. wrote:

Hola Amigos,
Aunque llevo unos meses aprendiendo Rails y leyendo atentamente
todos los hilos que van saliendo, quería realizar una consulta:

Cuando a un método de una clase se le antepone “Self.”, ¿Que quiere
decir esto? ¿Cual es la diferencia deno ponerselo. Por que la
diferencia entre metodos públicos y privados, creo que más o menos
la entiendo, ¿pero “Self”?

Hay varios idiomas para crear metodos de clase, ese es uno:

class Foo
def self.metodo_de_las_clase_Foo
‘foo!’
end
end
Foo.metodo_de_las_clase_Foo # -> foo!
Foo.new.metodo_de_las_clase_Foo # -> NoMethodError

class Bar < Foo; end
Bar.metodo_de_las_clase_Foo # -> foo!

– fxn

On Dec 1, 2006, at 12:05 PM, Fernando V. wrote:

Sigo sín pillarlo :frowning:

Vamos con ello :-), los conceptos de clase, de instancia, y de metodo
los tienes?

Sigo sín pillarlo :frowning:

El día 1/12/06, Xavier N. [email protected] escribió:

Vale, vale, ya lo voy pillando un poco. Pero entonces que diferencia hay
entre un método “Private” y uno “Self”.
¿El Private no se puede invocar desde fuera de la clase y el Self en
cambio
si?
¿Y entonces la difrencia entre un "Public y un Self es que si bien ambos
se
pueden invocar fuera, para el Public hay que instanciar con “new” y con
Self
no?
Si es así lo voy entendiendo, sino, es que me estoy haciendo un lío.
Los lenguajes que mejor controlo son Actionscript y Javascript, luego
PHP, y
tengo nociones de Java. (lo digo cómo referencia de mi torpeza con
Ruby)…

El día 1/12/06, Xavier N. [email protected] escribió:

En realidad los conceptos que te faltan son los relacionados con
orientación a objetos. Tienes que tener en cuenta la diferencia entre
una clase y una instacia de esa clase. Un metodo self.metodo es un
método que pertenece a la clase, no a cada instancia, y por tanto es el
mismo para todas las instancias de ese objeto. Si vienes de java, es el
equivalente a un método declarado como static. Nada que ver con un
metodo private, que es una función a la que solo se puede acceder desde
dentro de la instancia a la que pertenece.(Aquí tienes un tutorial de
POO: http://www.javahispano.org/cursotext.viewer.action?file=introd ).
Un saludo,
Juanjo

----- Original Message -----
From: Fernando V.
To: La lista sobre Ruby On Rails (rubyonrails.com) en castellano
Sent: Friday, December 01, 2006 12:25 PM
Subject: Re: [Ror-es] Métodos Self

Vale, vale, ya lo voy pillando un poco. Pero entonces que diferencia
hay entre un método “Private” y uno “Self”.
¿El Private no se puede invocar desde fuera de la clase y el Self en
cambio si?
¿Y entonces la difrencia entre un "Public y un Self es que si bien
ambos se pueden invocar fuera, para el Public hay que instanciar con
“new” y con Self no?
Si es así lo voy entendiendo, sino, es que me estoy haciendo un lío.
Los lenguajes que mejor controlo son Actionscript y Javascript, luego
PHP, y tengo nociones de Java. (lo digo cómo referencia de mi torpeza
con Ruby)…

El día 1/12/06, Xavier N. [email protected] escribió:
On Dec 1, 2006, at 12:05 PM, Fernando V. wrote:

> Sigo sín pillarlo :-(

Vamos con ello :-), los conceptos de clase, de instancia, y de 

metodo
los tienes?

_______________________________________________
Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Fernando V.
Web Designer
http://www.fernandoval.com



Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Vale, lo voy pillando.
En actionscript 2.0 con OOP, es cómo en Java. Se trata de métodos
Static. Es
decir unos métodos que simpre van a ser iguales para todas las
instancias de
la clase. Y a a los que por tanto no se les puede pasar parametros. Creo
que
es más o menos lo que me has dicho. Pero me lo explico a mi mismo para
comprobar que lo entiendo.

El día 1/12/06, Juanjo Bazán [email protected] escribió:

El Viernes, 1 de Diciembre de 2006 12:08, Fernando V.
escribió:> Vale, lo voy pillando.

En actionscript 2.0 con OOP, es cómo en Java. Se trata de métodos Static.
Es decir unos métodos que simpre van a ser iguales para todas las
instancias de la clase. Y a a los que por tanto no se les puede pasar
parametros. Creo que es más o menos lo que me has dicho. Pero me lo explico
a mi mismo para comprobar que lo entiendo.

No, no se trata de eso.

Tienes dos clases de métodos:

  • métodos de instancia (los métodos de cada instancia -u objeto-).
  • los métodos de clase. Son métodos de la clase en sí misma.

Por ejemplo, si tenemos una clase Libro en Rails:

  • mi_libro.titulo
    “titulo” en este caso es un método de un objeto libro concreto.

  • Libro.find_by_titulo(‘Programming Ruby’)
    “find_by_titulo” es un método de la propia clase en sí. ¿A quién le preguntas
    por un libro con un título determinado? Pues a la propia clase Libro. Y,
    como
    puedes observar, sí se les pueden pasar parámetros (como cualquier otro
    método).

En el caso de Ruby, los métodos de clase son una consecuencia directa de
que
las clases son también objetos (de la clase Class)… pero eso dejémoslo
para
otro momento.


Imobach González Sosa
banot.net
Correo-e: imobachgs en banot punto net

Fernando, quizás para agregar a todas las explicaciones que ya te dieron:

Pensá que un método de clase sería simplemente una función. Es un
método que no necesita ninguna instancia (instancia = espacio
reservado de memoria para almacenar el estado interno del objeto). En
PHP harías algo como:

$personas = buscarPersonas();

En PHP también se puede hacer, pero en Ruby el hecho de que todo sea
un objeto te empuja a hacerlo más fácil:

personas = Persona.buscar

Es más fácil verlo con este tipo de métodos que son constructores, es
decir, te van a devolver instancias de clase Persona, pero la primera
llamada, claro está, se hace sobre algo que no es una instancia (es
“estático”).

De hecho, un método de clase que seguramente usás muchísimo es el
mismo new, que está definido en Object y es la forma en que se
instancia una clase (es decir, la forma en que reservo un espacio de
memoria para almacenar un nuevo objeto con todo su estado).

persona = Persona.new

Esto se superpone con los conceptos de control de acceso (public,
protected y private). Podrías tener método de clase protegidos o
privados (al momento que digo esto estoy probando con irb si se puede
especificar un método de clase privado, y me parece que no… alguien
puede confirmarlo?) Pero eso ya es un poco más raro. Solamente
queríadecirte que son cosas conceptualmente diferentes, no comparables.

Como en todos los lenguajes que conozco, los métodos de clase pueden
recibir parámetros como cualquier otro.

Persona.new(“Fernando”, “Val”)

Bueno, no se me ocurre nada más que no haya sido dicho mejor por los
demás :slight_smile:

Saludos!

On Dec 1, 2006, at 3:07 PM, Damian J. wrote:

Esto se superpone con los conceptos de control de acceso (public,
protected y private). Podrías tener método de clase protegidos o
privados (al momento que digo esto estoy probando con irb si se puede
especificar un método de clase privado, y me parece que no… alguien
puede confirmarlo?) Pero eso ya es un poco más raro. Solamente quería
decirte que son cosas conceptualmente diferentes, no comparables.

Sipe, para ver eso ya hay que bajar a la clase singleton (Fernando,
esto es un tecnicismo acerca de que son en realidad los metodos de
clase en Ruby). Como sabeis los metodos de clase son metodos de
instancia de la clase singleton de la clase como objeto mismo de
Class, y es ahi donde aplican las funciones de control de visibilidad:

fxn@feynman:~/tmp$ cat foo.rb
class A
class << self
def a
b
end
private
def b
“b”
end
end
end
fxn@feynman:~/tmp$ irb
irb(main):001:0> require ‘foo’
=> true
irb(main):002:0> A.a
=> “b”
irb(main):003:0> A.b
NoMethodError: private method `b’ called for A:Class
from (irb):3

El metodo A.a puede llamar a A.b, pero este ultimo es privado.

– fxn

El Viernes, 1 de Diciembre de 2006 11:59, Fernando V. escribió:

Disculpa, pero no lo pillo (es que soy diseñador y aún estoy “tierno” con
Rails…

Un método normal sólo puede ser llamado desde un objeto de su clase,
ejemplo:

mi_objeto = Objeto.new
mi_objeto.metodo_de_instancia(parámetros)

Sin embargo, un método que se declara con “self.” delante es un método
de
clase, esto es, no se llama desde un objeto sino desde la propia clase:

Objeto.método_de_clase(parámetros)

De hecho si haces:

mi_objeto = Objeto.new
mi_objeto.método_de_clase(parámetros)

te da error pues NO es un método de instancia sino de clase.

Gracias Xavier, había hecho una prueba rápida con def, no con class <<self.

Espero que no estemos mareando demasiado a Fernando :stuck_out_tongue: