How to get the return value from method of the super class?

J

Josef Wolf

Hello,

I am trying to override a method of a superclass within my derived class.
To do the real work, I need to call the original method of the superclass.
But when I try to get the return value of the super method, I only get
the object, not the return values I expected. Here's a code snippet to
demonstrate the problem, stripped from everything not related to the
problem:

jw@raven> cat ./test.rb
#! /usr/bin/ruby

require 'tk'
require 'pp'

root = TkRoot.new { title "pcb.rb" }

class TkDerivedCanvas < TkCanvas
def coords(tag, *args)
super(tag, args)
end
end

orig = TkCanvas.new:)scrollregion=>[0,0,500,400]).pack()
derived = TkDerivedCanvas.new:)scrollregion=>[0,0,500,400]).pack()

origrect = TkcRectangle.new(orig, [100,100], [300, 200], :fill=>"red")
derivedrect = TkcRectangle.new(derived, [100,100], [300, 200], :fill=>"red")

pp orig.coords(origrect)
pp derived.coords(derivedrect)

jw@raven> ./test.rb
[100.0, 100.0, 300.0, 200.0]
#<TkDerivedCanvas:0xb7cce11c @path=".w00001">
jw@raven>


Any ideas what I am doing wrong here?
 
D

David A. Black

Hi --

Hello,

I am trying to override a method of a superclass within my derived class.
To do the real work, I need to call the original method of the superclass.
But when I try to get the return value of the super method, I only get
the object, not the return values I expected. Here's a code snippet to
demonstrate the problem, stripped from everything not related to the
problem:

jw@raven> cat ./test.rb
#! /usr/bin/ruby

require 'tk'
require 'pp'

root = TkRoot.new { title "pcb.rb" }

class TkDerivedCanvas < TkCanvas
def coords(tag, *args)
super(tag, args)
end
end

orig = TkCanvas.new:)scrollregion=>[0,0,500,400]).pack()
derived = TkDerivedCanvas.new:)scrollregion=>[0,0,500,400]).pack()

origrect = TkcRectangle.new(orig, [100,100], [300, 200], :fill=>"red")
derivedrect = TkcRectangle.new(derived, [100,100], [300, 200], :fill=>"red")

pp orig.coords(origrect)
pp derived.coords(derivedrect)

jw@raven> ./test.rb
[100.0, 100.0, 300.0, 200.0]
#<TkDerivedCanvas:0xb7cce11c @path=".w00001">
jw@raven>


Any ideas what I am doing wrong here?

Yes; the syntax of your call to super is wrong. If you want to call
super with the same arguments as the ones you got, just do:

super

with no argument list. Also, in general, if you want to call another
method with the same arguments, you need to do:

def m(*args)
other(*args) # note the *
end

If you leave the * off of the call to other, you'll be sending a
single argument (an array) instead of a list of arguments (the
elements of the array).

In the case of super you don't need to do that; just don't provide any
argument list at all. (That's because super is a keyword, not a
method, and has its own semantics.)


David

--
David A. Black / Ruby Power and Light, LLC / http://www.rubypal.com
Ruby/Rails training, mentoring, consulting, code-review
Latest book: The Well-Grounded Rubyist (http://www.manning.com/black2)

September Ruby training in NJ has been POSTPONED. Details to follow.
 
J

Josef Wolf

]
class TkDerivedCanvas < TkCanvas
def coords(tag, *args)
super(tag, args)
end
end
[ ... ]
with no argument list. Also, in general, if you want to call another
method with the same arguments, you need to do:

def m(*args)
other(*args) # note the *
end

If you leave the * off of the call to other, you'll be sending a
single argument (an array) instead of a list of arguments (the
elements of the array).

Thanks for the explanation, David! Works better now.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,901
Latest member
Noble71S45

Latest Threads

Top