Forum: Italian Ruby user group problemi di un principiante

Posted by matteo sbrizzi (matteosbrizzi)
on 2012-06-04 09:34
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 :)
Posted by Sergio Berisso (Guest)
on 2012-06-04 11:49
(Received via mailing list)
Il giorno 04 giugno 2012 09:34, matteo sbrizzi <matteo.sbrizzi@yahoo.it> 
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/Synt...
http://juixe.com/techknow/index.php/2007/01/22/rub...

Per maggiori info su ruby (come linguaggio) :
http://rubymonk.com/
http://www.scribd.com/doc/2236084/Whys-Poignant-Gu...
http://www.humblelittlerubybook.com/book/
http://pragprog.com/book/ruby3/programming-ruby-1-9

Ciao,
Sergio
Posted by gabriele renzi (Guest)
on 2012-06-04 18:35
(Received via mailing list)
On Mon, Jun 4, 2012 at 11:48 AM, Sergio Berisso
<sergio.berisso@gmail.com> 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 `<main>'
>> 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
Posted by matteo sbrizzi (matteosbrizzi)
on 2012-06-04 19:05
gabriele renzi wrote in post #1063054:
> On Mon, Jun 4, 2012 at 11:48 AM, Sergio Berisso
> <sergio.berisso@gmail.com> 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 `<main>'
>>> 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
Posted by Paolo Montrasio (pmontrasio)
on 2012-06-04 19:23
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 https://github.com/whymirror/shoes 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
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.