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

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:

[email protected]> 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)

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

Any ideas what I am doing wrong here?

Hi –

On Wed, 9 Sep 2009, Josef W. wrote:

#! /usr/bin/ruby
end
[email protected]> ./test.rb
[100.0, 100.0, 300.0, 200.0]
#<TkDerivedCanvas:0xb7cce11c @path=".w00001">
[email protected]>

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.

On Wed, Sep 09, 2009 at 08:17:05PM +0900, David A. Black wrote:
[ … ]

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.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs