NoMethodError: private method `sub' called for A:Class

Hola, ¿alguien puede explicarme qué está mal hecho aquí?

class A
attr_accessor :my_class
def initialize
@my_class = self.class.sub(“A”,“B”)
end
end

a = A.new
NoMethodError: private method sub' called for A:Class from (irb):3:ininitialize’
from (irb):8:in `new’
from (irb):8
from :0

¿Por qué no puedo operar en modo lectura con “self.class”?
Es decir, si sólo hiciese:
@my_class = self.class
entonces no hay problema, pero si ejecuto algún método sobre
“self.class” me
da ese error.

¿Alguna explicación?

Gracias.

Es que self.class devuelve un objeto de tipo Class, que no tiene
metodo “sub” (que es precisamente lo que dice el error).

Me da la impresion de que lo que quieres es obtener el nombre de la
clase… que si es un String que tiene metodo sub.

self.class.name.sub(“A”, “B”)

A veces es bueno leer los mensajes de error a ver que dicen. Suelen
ser acertados.

El Jueves, 4 de Octubre de 2007, Sebastian D.
escribió:> Es que self.class devuelve un objeto de tipo Class, que no tiene

metodo “sub” (que es precisamente lo que dice el error).

Me da la impresion de que lo que quieres es obtener el nombre de la
clase… que si es un String que tiene metodo sub.

self.class.name.sub(“A”, “B”)

Vaya, estaba empeñado en que “self.class” devolvía un String, y veo ahora que
devuelve un objeto de tipo Class que, como dices, no tiene método “sub” ni
similares.
Ni me planteé que “self.class” fuese algo distinto a String, de ahí mi tonto
error.

A veces es bueno leer los mensajes de error a ver que dicen. Suelen
ser acertados.

Te garantizo que siempre leo los mensajes de error e intento
entenderlos.
En este caso no sé hasta que punto es obvio:
“NoMethodError: private method `sub’ called for A:Class”

Vale, “NoMethodError” podría indicar que ese método no existe, pero ¿por qué
luego asume que de existir sería “private”? Me he liado un poco por ello.

Bueno, sin más, que espero caer en menos dudas tontas cada vez. :wink:

Gracias.

otro consejo… aprovechate del script/console para probar esas
cosas… o del breakpoint o del nuevo ruby-debug que es aun mejor.

mas de una vez nos pasa que creemos y juramos y perjuramos que el
metodo devuelve un cierto objeto cuando en realidad devuelve al que
lo contiene, o a algun contenido derivado.

El Viernes, 5 de Octubre de 2007, Sebastian D.
escribió:> otro consejo… aprovechate del script/console para probar esas

cosas… o del breakpoint o del nuevo ruby-debug que es aun mejor.

Lo que pasa es que de momento estoy sólo con Ruby, sin RoR.
Aunque el “ruby-debug” que mencionas no lo conocía, por el nombre supongo
que
es sólo Ruby. Lo investigaré, gracias.

mas de una vez nos pasa que creemos y juramos y perjuramos que el
metodo devuelve un cierto objeto cuando en realidad devuelve al que
lo contiene, o a algun contenido derivado.

Anotado :wink:

Gracias.

On 10/4/07, Iñaki Baz C. [email protected] wrote:

Te garantizo que siempre leo los mensajes de error e intento entenderlos.
En este caso no sé hasta que punto es obvio:
“NoMethodError: private method `sub’ called for A:Class”

Vale, “NoMethodError” podría indicar que ese método no existe, pero ¿por qué
luego asume que de existir sería “private”? Me he liado un poco por ello.

El método existe, sólo que es privado.

Si realmente quisieras podrías llamarlo mediante self.class.send(:sub) :slight_smile:

On Oct 5, 2007, at 12:03 AM, Iñaki Baz C. wrote:

Vale, “NoMethodError” podría indicar que ese método no existe, pero
¿por qué
luego asume que de existir sería “private”? Me he liado un poco por
ello.

Tuviste mala suerte ahi porque la cosa es algo liada y no se ve claro
de donde viene que piense que sub es un metodo privado de Class.

Para que la clase Class no nos lie veamos otros ejemplos mas simples
donde pasa lo mismo:

irb(main):004:0> nil.sub
NoMethodError: private method sub' called for nil:NilClass from (irb):4 irb(main):005:0> 0.sub NoMethodError: private methodsub’ called for 0:Fixnum
from (irb):5

Ocurre que el modulo Kernel define un metodo de instancia privado
Kernel#sub que puede llamarse al estilo procedural y es equivalente a
$_.sub!:

irb(main):001:0> $_ = “foo”
=> “foo”
irb(main):002:0> sub /$/, “bar”
=> “foobar”
irb(main):003:0> $_
=> “foobar”

Object incluye Kernel y es el root de la jerarquia de clases. Por
tanto, via Object los metodos de Kernel estan en el path de busqueda
de metodos de cualquier objeto, y son privados. De ahi el mensaje de
error.

– fxn

El Viernes, 5 de Octubre de 2007, Xavier N.
escribió:>

error.
Magistral explicación. Gracias.

On Fri, Oct 05, 2007 at 12:37:10AM +0200, Iñaki Baz C. wrote:

El Viernes, 5 de Octubre de 2007, Sebastian D. escribió:

otro consejo… aprovechate del script/console para probar esas
cosas… o del breakpoint o del nuevo ruby-debug que es aun mejor.

Lo que pasa es que de momento estoy sólo con Ruby, sin RoR.
Aunque el “ruby-debug” que mencionas no lo conocía, por el nombre supongo que
es sólo Ruby. Lo investigaré, gracias.

Bueno, tienes el intérprete interactivo de Ruby para probar (irb).

Saludos.


Imobach González Sosa
imobachgs en banot punto net
osoh en jabberes punto org