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 )
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.
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.
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
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
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!
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
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
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
Detto questo, un paio di note:
è una pessima abitudine scrivere il codice in
italiano, funzioni, classi e variabili è meglio
metterle in inglese.