Esta pregunta tiene dos partes.Extendiendo clases e instancias
En el libro de Ruby Programming Language, no es un ejemplo (sección 8.1.1) de extender un objeto de cadena y clase con un módulo.
Primera pregunta. ¿Por qué si extiendes una clase con un nuevo método y luego creas un objeto/instancia de esa clase, no puedes acceder a ese método?
irb(main):001:0> module Greeter; def ciao; "Ciao!"; end; end
=> nil
irb(main):002:0> String.extend(Greeter)
=> String
irb(main):003:0> String.ciao
=> "Ciao!"
irb(main):004:0> x = "foo bar"
=> "foo bar"
irb(main):005:0> x.ciao
NoMethodError: undefined method `ciao' for "foo bar":String
from (irb):5
from :0
irb(main):006:0>
Segunda parte, Cuando trato de extender un objeto Fixnum, obtengo un error de método indefinido. ¿Alguien puede explicar por qué esto funciona para una cadena pero no un fixnum?
irb(main):045:0> module Greeter; def ciao; "Ciao!"; end; end
=> nil
irb(main):006:0> 3.extend(Greeter)
TypeError: can't define singleton
from (irb):6:in `extend_object'
from (irb):6:in `extend'
from (irb):6
Su respuesta a la primera parte no explica (a mí) el por qué. En otros idiomas, cuando cambia la clase y crea un nuevo objeto de ese tipo de clase, obtiene el nuevo método. Estoy asumiendo que hay una conexión de clase a objetos que no es válida. ¿Puedes explicar por qué esa conexión no es válida aquí? – teleball
Investigar el "incluir" que me diste ayudó. Entonces, parece que ahora que entiendo que existe una diferencia entre extender e incluir, y ahora sé qué buscar, hay una publicación aquí que explica esas diferencias: http://stackoverflow.com/questions/156362/what- is-the-difference-between-include-and-extend-in-ruby – teleball