[Rubies] Abriendo modulos

0 views
Skip to first unread message

Juan Gallego

unread,
Dec 27, 2008, 10:04:30 AM12/27/08
to rub...@listas.escomposlinux.org
Buenas lista,

Estoy bastante liado con una cuestión sobre herencias, mixins y demás. Necesitaba abrir un modulo pero lo único que conseguía era sobreescribirlo y hacer desaparecer todos sus métodos salvo los nuevos definidos.

No podía hacer un mixin ya que tenía que llamarse igual y claro, bucle infinito. La cuestión es que he hecho un require del modulo original y funciona estupendamente, pero es algo que me ralla bastante ya que si tengo lo siguiente:

module Foo
  require File.dirname(__FILE__) + "/../lib/foo"

  def bar
    ...
  end
end

y la definición en lib/foo.rb es

module Foo
  def fooz
    ...
  end
end

¿No estoy metiendo un modulo dentro del otro?

Siento no explicarme mejor pero no me entiende ni google :P

- Juan

DaVinci

unread,
Dec 27, 2008, 10:38:37 AM12/27/08
to rub...@listas.escomposlinux.org
El sábado 27 de diciembre, Juan Gallego escribió:

> Buenas lista, Estoy bastante liado con una cuestión sobre herencias,
> mixins y demás. Necesitaba abrir un modulo pero lo único que
> conseguía era sobreescribirlo y hacer desaparecer todos sus métodos
> salvo los nuevos definidos.

No entiendo el origen de tu problema. A mí me funciona perfectamente
este código:

-------------------
module Holadios
def hola
puts "hola"
end
end

module Holadios
def adios
puts "adiós"
end
end

class Buzz
include Holadios

def holadios
hola
adios
end
end

Buzz.new.holadios
-------------------

¿Lo has intentado así? ¿Qué error obtienes?

David
_______________________________________________
Rubies mailing list
Rub...@listas.escomposlinux.org
https://listas.escomposlinux.org/mailman/listinfo/rubies

Juan Gallego

unread,
Dec 27, 2008, 11:24:03 AM12/27/08
to rub...@listas.escomposlinux.org
Un dato, que parece importante, y que se me olvido exponer es que todo esto ocurre durante el proceso de carga de Rails. Parece que un archivo sustituye al otro.

He sacado el require a una linea antes de la re-apertura del modulo y también funciona. De momento me parece que tiene más sentido que como lo tenía antes.

La cosa es que es me sigo preguntando como haciendo el require dentro del modulo Ruby lo interpreta bien. 

En fin, muchas gracias por tu tiempo ;-)

- Juan

2008/12/27 DaVinci <dav...@escomposlinux.org>

Ernesto Jiménez

unread,
Dec 27, 2008, 12:20:58 PM12/27/08
to Juan Gallego, rub...@listas.escomposlinux.org
BTW, igual que hago Foo.include se podría hacer Foo.extend, as you wish :)

2008/12/27 Ernesto Jiménez <ernesto...@negonation.com>
AFAIK el require de ruby da lo mismo dónde lo hagas, lo único que hace es cargar el .rb en cuestión.

Lo puedes hacer dentro de un método y eso no quiere decir que el código se cargue dentro del scope del método.

El tema de extender módulos, a mí personalmente no me gusta hacerlo a pelo. Prefiero los mixins:
https://gist.github.com/2d328c7f0e97fa1a697c


2008/12/27 Juan Gallego <juan.ga...@gmail.com>:
Ernesto Jiménez
Software Engineer Leader
Tractis - Online contracts you can enforce
http://www.tractis.com
--
Mobile: +34 620 47 53 82
Email: ernesto...@tractis.com
Skype: ernestojc
Blog: http://blog.negonation.com
LinkedIn: http://www.linkedin.com/in/ernestojimenez




--
Ernesto Jiménez
Software Engineer Leader
Tractis - Online contracts you can enforce
http://www.tractis.com
--
Mobile: +34 620 47 53 82
Email: ernesto...@tractis.com
Skype: ernestojc
Blog: http://blog.negonation.com
LinkedIn: http://www.linkedin.com/in/ernestojimenez

Ernesto Jiménez

unread,
Dec 27, 2008, 12:20:07 PM12/27/08
to Juan Gallego, rub...@listas.escomposlinux.org
AFAIK el require de ruby da lo mismo dónde lo hagas, lo único que hace es cargar el .rb en cuestión.

Lo puedes hacer dentro de un método y eso no quiere decir que el código se cargue dentro del scope del método.

El tema de extender módulos, a mí personalmente no me gusta hacerlo a pelo. Prefiero los mixins:
https://gist.github.com/2d328c7f0e97fa1a697c


2008/12/27 Juan Gallego <juan.ga...@gmail.com>:

Juan Gallego

unread,
Dec 27, 2008, 12:55:54 PM12/27/08
to Ernesto Jiménez, rub...@listas.escomposlinux.org
Wow! Gran solución :-D

Nunca había usado Ruby2Ruby para ver el resultado "real". Es genial.

Aplicando tu solución solo me encuentro con una pega. Los métodos redefinidos aparecen duplicados, la versión anterior y la nueva al final del modulo. Obviamente sigue funcionando ya que se queda con la última definición pero.. ¿es lo normal?.

- Juan

2008/12/27 Ernesto Jiménez <ernesto...@negonation.com>
Reply all
Reply to author
Forward
0 new messages