Problemi di un principiante

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 :slight_smile:

Il giorno 04 giugno 2012 09:34, matteo sbrizzi [email protected]
ha
scritto:

x dichiarata cos variabile locale al metodo del bottone “calcola”
quindi in “stampa” x non ha valore

le variabili di istanza della classe si dichiarano cos : @x = 5 + 2

Vedi:
http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Variables_and_Constants

Per maggiori info su ruby (come linguaggio) :
http://rubymonk.com/

http://www.humblelittlerubybook.com/book/

Ciao,
Sergio

On Mon, Jun 4, 2012 at 11:48 AM, Sergio B.
[email protected] wrote:

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

class Klass
def foo
$x = 1
end
end

(che brutta pratica, ma un’altro discorso)


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com

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 @

Ciao
Paolo

gabriele renzi wrote in post #1063054:

On Mon, Jun 4, 2012 at 11:48 AM, Sergio B.
[email protected] wrote:

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.

parole = Array.new

INSERIMENTO DI ALCUNE PAROLE NEL ARRAY

parole.push(“gazzella”,“stagionatura”,“antracite”)

CREAZIONE DELL’INTERFACCIA SHOES

Shoes.app do

TITOLO DEL GIOCO

title “GIOCO DELL’IMPICCATO”

CREAZIONE DEL PULSANTE PER AVVIARE UN NUOVO GIOCO

button(“Nuovo Gioco”)do

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

class Klass
def foo
$x = 1
end
end

(che brutta pratica, ma un’altro discorso)


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com