Hi, I’ll explain my problem with an example code:
module M
def hello
puts “hello !!!”
B.new
end
class B
def initialize
puts “B instance initialized !!!”
bye() <— ERROR !!!
end
end
end
class A
include M
def bye
puts “bye !!!”
end
end
a = A.new
a.hello
I want the following behaviour:
irb> a.hello
=> “hello !!!”
=> “B instance initialized !!!”
=> “bye !!!”
But the last bye() gives an error since, of course, “bye” is not defined
in B
class, but in A class.
I know that if it would be:
module M
def hello
puts “hello !!!”
bye
end
end
irb> a.hellp
This works since “bye()” calls the “bye” method in class A. But this is
not my
case.
How could I call A#bye method from M::B class?
Thanks a lot.
2008/9/9 Iñaki Baz C. [email protected]
def initialize
def bye
I want the following behaviour:
irb> a.hellp
This works since “bye()” calls the “bye” method in class A. But this is not
my
case.
How could I call A#bye method from M::B class?
Thanks a lot.
To call a method from another class in the context of an instance of B,
put
this inside M::B#initialize:
A.instance_method(:bye).bind(self).call()
Hard to tell from this code, seeing as how it does nothing apparently
useful, but if you find yourself doing this it may be a sign that you
need
to rethink your design.
Hi –
On Wed, 10 Sep 2008, James C. wrote:
include M
B
Thanks a lot.
To call a method from another class in the context of an instance of B, put
this inside M::B#initialize:
A.instance_method(:bye).bind(self).call()
That won’t work here, because you’d need an instance of A (or a
subclass of A).
Hard to tell from this code, seeing as how it does nothing apparently
useful, but if you find yourself doing this it may be a sign that you need
to rethink your design.
It definitely looks a bit inside-out: A requires that M exist, but A
is essentially trying to serve as a superclass for M::B. Sort of like
this:
module M
def hello
puts “hello !!!”
B.new
end
end
class A
include M
def bye
puts “bye !!!”
end
end
module M
class B < A
def initialize
puts “B instance initialized !!!”
bye
end
end
end
which works, but does indeed look like it would need some ironing out
in the design.
David
El Miércoles, 10 de Septiembre de 2008, David A. Black escribió:
   puts “bye !!!”
end
which works, but does indeed look like it would need some ironing out
in the design.
Thanks a lot. Maybe I should re-desing the code to avoid using things so
exotic… 
Really thanks a lot to both.