ciao a tutti, sono nuovissimo e sto cercando di fare un progetto in ruby
per l’università che riguarda il gioco dell’impiccato; però mi ritrovo
ad avere vari problemi con le variabili. Praticamente quando io creo
degli oggetti grafici tipo bottoni e ad ogni pulsante faccio eseguire
un’azione, ho dei problemi con il valore delle variabili che non vengono
ricordate. faccio un mini esempio…
button(“calcola”)do
x = 5 + 2
end
button(“stampa”) do
title x
end
praticamente io eseguo il codice e lui non mi stampa niente perchè il
pulsante stampa non sa a quanto corrisponde x (questo è abbastanza
strano perchè su altri linguaggi di programmazione il codice funziona).
Ho provato a mettere le variabili globali e comunque non mi funziona…
visto che non centra la complessità di un esercizio, perchè provando a
svilupparli con altri linguaggi mi vengono, a sto punto penso che
riguardi la sintassi che si utilizza su ruby, magari bisogna scrivere il
codice in un altro modo…
grazie a tutti
praticamente io eseguo il codice e lui non mi stampa niente perch il
pulsante stampa non sa a quanto corrisponde x
x dichiarata cos variabile locale al metodo del bottone “calcola”
quindi in “stampa” x non ha valore
non solo locale al metodo, locale al blocco, che secondo me
pi il problema. Se la inizializzi fuori dal blocco ruby sapr che sta
facendo riferimento a quella
[1,2,3].each do |x| a= x end
=> [1, 2, 3]
a
NameError: undefined local variable or method a' for main:Object from (irb):2 from /russiawithlove:16:in ’
a=nil
=> nil
[1,2,3].each do |x| a= x end
=> [1, 2, 3]
a
=> 3
non ho ben capito se quello che intendevi per mettendola globale, ma
se hai fatto una cosa tipo
x= nil
class Klass
def foo
x = 1
end
end
ricadi nel caso che diceva sergio, quella “x” la fuori locale nello
scope fuori dalla classe, e se volevi una globale dovevi fare
Quando si impara un linguaggio una delle primissime cose da fare è
googlare le regole di scoping. Studia http://marakana.com/bookshelf/ruby_tutorial/scope.html che inizia con
una parte fondamentale su quale sia il valore di self nei vari contesti
e prosegue con lo scoping (e poi dimentica la parte sulle variabili
globali, programma come se non esistessero).
Per il tuo caso particolare, a GitHub - whymirror/shoes: a tiny graphical app kit for ruby c’è un
esempio con Shoes in cui si vede chiaramente come far rendere visibile
il valore di una variabile @label a due diversi button. E’ importante
che la variabile sia una @
praticamente io eseguo il codice e lui non mi stampa niente perch il
pulsante stampa non sa a quanto corrisponde x
x dichiarata cos variabile locale al metodo del bottone “calcola”
quindi in “stampa” x non ha valore
non solo locale al metodo, locale al blocco, che secondo me
pi il problema. Se la inizializzi fuori dal blocco ruby sapr che sta
facendo riferimento a quella
[1,2,3].each do |x| a= x end
=> [1, 2, 3]
a
NameError: undefined local variable or method a' for main:Object from (irb):2 from /russiawithlove:16:in ’
a=nil
=> nil
metto il codice così si riesce a capire meglio. (non è ancora completo e
posto quello iniziale senza modifiche).
CREAZIONE DELL’ARRAY CONTENENTE LE PAROLE CHE PER GIOCARE.
numrandom = rand(parole.length)
stringacorretta = parole[numrandom]
numcaratteri = stringacorretta.length
stringa = $stringacorretta
accento = false
# CREAZIONE DEL PULSANTE CHE GENERA' CASUALMENTE UNA PAROLA
button("Genera") do
contatore = 0
carattere = 1
if(stringa[numcaratteri-1] == "'")
accento = true
while (contatore < (numcaratteri-3))
stringa[carattere] = "-"
carattere = carattere + 1
contatore = contatore + 1
end
title stringa
else
accento = false
while (contatore < (numcaratteri-2))
stringa[carattere] = "-"
carattere = carattere + 1
contatore = contatore + 1
end
title stringa
end
end
# CREAZIONE DELLE LETTERE DI GIOCO
numsostituzioni = 0
i = 1
#numrandom = @numrandom
#stringacorretta = @stringacorretta
#numcaratteri = @numcaratteri
#stringa = stringacorretta
button("a")do
if(accento == true)
while(i < (numcaratteri-3))
if(stringacorretta[i] == "a")
stringa[$i] = "a"
numsostituzioni = numsostituzioni + 1
para numsostituzioni
end
i = i + 1
end
if(numsostituzioni == 0)
para "Errore1"
else
title stringa
para "hai fatto " + $numsostituzioni
end
para stringa
else
while(i < (numcaratteri-2))
if(stringacorretta[i] == "a")
stringa[i] = "a"
numsostituzioni = numsostituzioni + 1
para numsostituzioni
end
i = i + 1
end
if(numsostituzioni == 0)
para "Errore1"
else
title stringa
para "hai fatto " + numsostituzioni
end
end
end
[1,2,3].each do |x| a= x end
=> [1, 2, 3]
a
=> 3
non ho ben capito se quello che intendevi per mettendola globale, ma
se hai fatto una cosa tipo
x= nil
class Klass
def foo
x = 1
end
end
ricadi nel caso che diceva sergio, quella “x” la fuori locale nello
scope fuori dalla classe, e se volevi una globale dovevi fare