[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Is there a better way to do this wxPython example in Ruby?

Wayne Magor

7/27/2008 3:16:00 AM

I have been translating examples from the book "wxPython in Action"
into Ruby using wxRuby2. I ran into one example where a method was
passed as a parameter in Python. I came up with the solution shown
below in Ruby (which works fine) but it seems ugly to me. If someone
was not very familiar with Ruby they would say "hmmm... what's this
ampersand lambda stuff".

Is there a better way to do this in Ruby?


Python example using wxPython:

def createButtonBar(self, panel):
self.buildOneButton(panel, "FIRST", self.OnFirst)
self.buildOneButton(panel, "<< PREV", self.OnPrev, (80, 0))
self.buildOneButton(panel, "NEXT >>", self.OnNext, (160, 0))
self.buildOneButton(panel, "LAST", self.OnLast, (240, 0))

def buildOneButton(self, parent, label, handler, pos=(0,0)):
button = wx.Button(parent, -1, label, pos)
self.Bind(wx.EVT_BUTTON, handler, button)
return button


My translation to Ruby and wxRuby2:

def create_button_bar(panel)
build_one_button(panel, "FIRST", &lambda {|e|
on_first(e)})
build_one_button(panel, "<< PREV", [80, 0], &lambda {|e|
on_prev(e)})
build_one_button(panel, "NEXT >>", [160, 0], &lambda {|e|
on_next(e)})
build_one_button(panel, "LAST", [240, 0], &lambda {|e|
on_last(e)})
end

def build_one_button(parent, label, pos=[0,0], &handler)
button = Wx::Button.new(parent, -1, label, pos)
evt_button(button) {|event| yield(event)}
return button
end

3 Answers

David Masover

7/27/2008 3:18:00 AM

0

On Saturday 26 July 2008 22:14:01 Wayne Magor wrote:

> build_one_button(panel, "LAST", [240, 0], &lambda {|e|
> on_last(e)})

> def build_one_button(parent, label, pos=[0,0], &handler)

Looks like, at the very least, you could do:

build_one_button(panel, "LAST", [240,0]) {|e| on_last(e)}

I think your function is already set up to accept a block, so it's the same
syntax as each(), which you're probably already familiar with:

(1..99).each {|i| puts "#{i} bottles of beer on the wall..."}

Joshua Ballanco

7/28/2008 12:21:00 AM

0

Wayne Magor wrote:
> Is there a better way to do this in Ruby?

What about passing the method name as a Symbol and then using
Object.send in the reciever? Something like:

build_one_button(panel, "FIRST", :on_first)

def build_one_button(parent, label, pos=[0,0], method_name)
button = Wx::Button.new(parent, -1, label, pos)
evt_button(button) {|event| self.send(method_name, event)}
return button
end
--
Posted via http://www.ruby-....

Lars Christensen

7/28/2008 12:09:00 PM

0

On Jul 27, 5:16 am, Wayne Magor <wemag...@gmail.com> wrote:
> Python example using wxPython:
>
>         self.buildOneButton(panel, "FIRST", self.OnFirst)

I think the most direct translation of the Python code would be:

build_one_button(panel, "FIRST", method(:on_first))

Simpler than the block wrapper, IMO, and more efficient.

Lars