Problema con ereditarietà e moduli

Sto lavorando ad un piccolo programma in Ruby, in particolare mi manca
la GUI.
Per farla uso le wxWidgets, andando a definire nel file gui.rb una
classe Gui che eredita Wx:App, quindi la dichiaro così: class Gui <
Wx::App
Tutte le classi che ho scritto precedentemente (e che si trovano in fle
diversi) sono comprese in un modulo , come anche la classe Gui.

Ma quando cerco di richiamare un metodo di una classe definita in
un’altra classe del modulo nn funziona.

Credo che il problema sia dovuto al fatto che la classe Gui eredita
Wx:App, perchè se tolgo l’ereditarietà i metodi vengono trovati ( così
nn funziona piu il resto, ovviamente )

Come posso fare per risolvere questo problema?

— Claudio B. [email protected] wrote:

Ma quando cerco di richiamare un metodo di una
classe definita in
un’altra classe del modulo nn funziona.

scusa ma questo punto non mi è chiaro, intendi che è
una cosa
così?
module Wx # module Wx fasullo
class App
end
end

module M # il tuo modulo
class Called #classi che richiami
def self.foo
p “foo”
end
end
class Inner < Wx::App # classe che richiama
def bar
Called.foo
end
end
end
un codice simile dovrebbe funzionare come ti aspetti
(i.e. M::Inner.new.bar stampa “foo” correttamente)

potresti ridurre il tuo problema ad un esmepio piccolo
da postare?
Ad ogni modo, immagino che un “include” o un
riferimento esteso (i.e. Modulo::Classe invece che
Classe) potrebbbe essere quello che ti serve.


Goto 10: http://www.goto10.it
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

  ___________________________________________________________

Want ideas for reducing your carbon footprint? Visit Yahoo! For Good
http://uk.promotions.yahoo.com/forgood/environment.html

gabriele renzi wrote:

potresti ridurre il tuo problema ad un esmepio piccolo
da postare?

Ho creato una classe, Ui, salvata nel file ui.rb e contenente le
definizioni dei metodi che poi andrò ad usare e l’inizializzazione di
alcune variabili globali.

La struttura è questa:

require ‘kaambusa/ui/text’
require ‘kaambusa/ui/gui’
require ‘kaambusa/ingrediente’
require ‘kaambusa/ricetta’
require ‘kaambusa/giornata’

module Kaambusa
class Ui
def main(ui)

  $lista_ricette = Array.new()

  Ui.carica_ingredienti
  Ui.carica_ricette
  Ui.carica_giornate

end

#metodi per la manipolazione del database ingredienti
def carica_ingredienti

end

end
end

il file gui.rb deve andare ad usare i metodi e le variabili definiti
nella classe Gui.

module Kaambusa

class SimpleFrame < Frame
def initialize(parent)

  evt_button(Wx::xrcid('inserisci')) do
    Kaambusa::Ui.aggiungi_ingrediente(
      # ...
    )

  end

class Gui < App
def on_init

  #debug
  puts "gui"
  puts $lista_ingredienti

  # Create a resource handler
  $xml = Wx::XmlResource.get();
  $xml.init_all_handlers();

  # Load a resource file
  $xml.load("kaambusa.xrc")

  # Show the main frame.
  SimpleFrame.new(self)

end

end

Gui.new.main_loop()
end

Ne la variabile $lista_ingredienti ne i metodi invocati da SimpleFrame,
come ad esempio Kaambusa::Ui.aggiungi_ingrediente non sono visibili.
il puts delle variabili restituisce nil, mentre l’errore riguardante i
metodi è:
uninitialized constant Kaambusa::Ui (NameError)

Ho riprovato facendo qualche modifica e ho notato di nuovo che se nella
dichiarazione della classe Gui elimino l’ereditarieta’ e i riferimenti a
metodi di Wx:App la variabile globale viene correttamente visualizzata.

Faccio un esempio:

class Gui
def on_init
puts $lista_ingredienti

,

end

end

da come output il contenuto della variabile

class Gui < App
def on_init
puts $lista_ingredienti

,

end

end

da come output nil

gabriele renzi wrote:

Per questo che ti chiedevo uno spezzone di codice
minimo eseguibile per fare due prove che riproduca iol
problema, almeno possiamo farti un po’ di debug remoto
:slight_smile:

Tutto il codice è disponibile all’indirizzo povegliano.org/downloads
all’interno dell’archivio kaambusa.tar.gz.
Per avviare il programma bisogna eseguire kaambusa.rb nella dir lib.
Grazie per l’interessamento!

— Claudio B. [email protected] wrote:

Ho riprovato facendo qualche modifica e ho notato di
nuovo che se nella
dichiarazione della classe Gui elimino
l’ereditarieta’ e i riferimenti a
metodi di Wx:App la variabile globale viene
correttamente visualizzata.

per la variabile globale… immagino che ci sia un
problema di ordine di esecuzione per cui non è
inizializzata.
(Ad ogni modo se è una lista potresti usare una
costante: il contenuto cambierà, ma l’oggetto Array
associato alla costante no)

Posso immaginare un problema solo in questo modo: la
classe Wx::App definisce const_missing.
Però questo dovrebbe succedere solo se è Wx::App a
fare riferimento alla costante, penso.

Per questo che ti chiedevo uno spezzone di codice
minimo eseguibile per fare due prove che riproduca iol
problema, almeno possiamo farti un po’ di debug remoto
:slight_smile:

  ___________________________________________________________

Want ideas for reducing your carbon footprint? Visit Yahoo! For Good
http://uk.promotions.yahoo.com/forgood/environment.html

— Claudio B. [email protected] wrote:

Tutto il codice è disponibile all’indirizzo
povegliano.org/downloads
all’interno dell’archivio kaambusa.tar.gz.
Per avviare il programma bisogna eseguire
kaambusa.rb nella dir lib.
Grazie per l’interessamento!

è un piacere, figurati.

Allora la diagnosi del Dott. Renzi è: hai fatto una
zozzeria, ma sei ancora curabile :slight_smile:

Il problema vero è che il codice di gui.rb esegue il
mainloop da dentro la definizione del modulo:

module Kaambusa
…fuffa…
Gui.new.main_loop
end

Quando viene eseguito?
Quando fai require ‘ui/gui’

Quando fai questo require?
Quando fai il require di ui.rb, e prima di aver
definito il modulo Ui.

Se spostassi il require in fondo a ui.rb questo errore
scomparirebbe.

Ma più in generale non dovresti eseguire codice nel
momento del require a meno che non ci sia un ottimo
motivo per farlo. Hai già la tua comoda funzione di
inizializzazione, richiamala quando avvii da una
funzione di inizializzazione globale e tutto andrò
bene :slight_smile:

Detto questo, un paio di note:

  1. è una pessima abitudine scrivere il codice in
    italiano, funzioni, classi e variabili è meglio
    metterle in inglese.

  2. questo:

    ingrediente[‘nome’] =
    Wx::Window.find_window_by_id(Wx::xrcid(‘nome’),self)
    ingrediente[‘kcal’] =
    Wx::Window.find_window_by_id(Wx::xrcid(‘kcal’),self)
    ingrediente[‘proteine’] =
    Wx::Window.find_window_by_id(Wx::xrcid(‘proteine’),self)
    ingrediente[‘grassi’] =
    Wx::Window.find_window_by_id(Wx::xrcid(‘grassi’),self)
    ingrediente[‘carboidrati’] =
    Wx::Window.find_window_by_id(Wx::xrcid(‘carboidrati’),self)
    ingrediente[‘unitamisura’] =
    Wx::Window.find_window_by_id(Wx::xrcid(‘unitamisura’),self)
    ingrediente[‘note’] =
    Wx::Window.find_window_by_id(Wx::xrcid(‘note’),self)

puoi riscriverlo come
for i in %w[note caroboidrati kcal etc etc]

ingrediente[i]=Window.find_window_by_id(xrcid(i),self)
end
Almeno mi sembra :slight_smile:


Goto 10: http://www.goto10.it
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

  ___________________________________________________________

Yahoo! Answers - Got a question? Someone out there knows the answer. Try
it
now.

gabriele renzi wrote:

Grazie! Provo subito a correggere secondo le tue indicazioni.