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:
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
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.
--
Iñaki Baz Castillo
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.
···
2008/9/9 Iñaki Baz Castillo <ibc@aliax.net>
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:
> 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
> 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.
Hi --
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:
> 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
> 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()
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
···
On Wed, 10 Sep 2008, James Coglan wrote:
2008/9/9 Iñaki Baz Castillo <ibc@aliax.net>
--
Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL
Advancing with Rails January 19-22 Fort Lauderdale, FL *
* Co-taught with Patrick Ewing!
See http://www.rubypal.com for details and updates!
Thanks a lot. Maybe I should re-desing the code to avoid using things so
exotic...
Really thanks a lot to both.
···
El Miércoles, 10 de Septiembre de 2008, David A. Black escribió:
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.
--
Iñaki Baz Castillo