Forum: Italian Ruby user group Aiuto primo programmone

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
138f094a9eba3379ce670fddd9d0f3c7?d=identicon&s=25 Davis Dave (davisdave)
on 2015-11-09 22:36
Attachment: Immagine.jpg (80 KB)
Salve a tutti,è la mia prima volta quì (premetto di non aver trovato
alcun regolamento che preveda una presentazione esplicita, ma qualora ce
ne fosse bisogno, scriverò immediatamente un topic di presentazione :)!
)
voglio rivolgermi a voi per ricevere una mano riguardo uno tra i miei
primi programmoni che scrivo; è un' esercizio che mi sta mettendo a dura
prova, in quanto sto cercando di renderlo assente da problemi, ma ecco
che, dopo aver fatto tutto, improvvisamente, chiamando un metodo già
definito tramite 'def' e assegnando a questo i parametri richiesti, mi
si presenta un errore di sintassi(vedi allegato) , che però non viene
segnalato quando
precedentemente nel corso del programma ho richiamato il metodo nela
stessa maniera di quando risulta erroneo riguardo la sintassi.
ho davvero bisogno di una mano, se serve il codice lo allego, ditemi
voi!
vi ringrazio in anticipo a tutti!
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2015-11-10 13:40
Credo che sia indispensabile vedere il codice. Copialo in un gist a
https://gist.github.com e dacci l'URL che ti genera. E' più comodo
leggerlo lì che in un allegato. Non mi pare che serva la registrazione.
138f094a9eba3379ce670fddd9d0f3c7?d=identicon&s=25 Davis Dave (davisdave)
on 2015-11-10 14:08
https://gist.github.com/c51b7759e6f79a9c1071.git
Ecco a te, grazie mille in anticipo!
138f094a9eba3379ce670fddd9d0f3c7?d=identicon&s=25 Davis Dave (davisdave)
on 2015-11-10 15:12
138f094a9eba3379ce670fddd9d0f3c7?d=identicon&s=25 Davis Dave (davisdave)
on 2015-11-10 15:27
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2015-11-10 15:28
L'ultima URL è un 404, e anche la prima. Ma a
https://gist.github.com/anonymous/c51b7759e6f79a9c1071 trovo il tuo
programma. L'indentazione è sparita ma ci pensa l'editor a rimettarla.

Leggendolo non si capisce molto cosa faccia (una puts con delle
spiegazioni prima della gets aiuterebbe), ma scrivendo numeri a caso:

$
$ ruby spank.rb
1
1
2
spank.rb:14:in `bisesitle': wrong number of arguments (0 for 1)
(ArgumentError)
  from x.rb:57:in `<main>'

Immagino che sia una versione del programma diversa da quella di cui
scrivevi. Come mai "bisesitle" invece di "bisestile"?

Ti consiglierei di non usare lo stesso nome per un metodo (def
bisesitle) e per una variabile (def bisrec bisesitle). Magari
distinguerli è sufficiente a risolvere i problemi.

Inoltre è idiomatico usare le parentesi nella definizione dei metodi,
come in def bisrec(bisesitle). A proposito di stile, leggi
https://github.com/styleguide/ruby
138f094a9eba3379ce670fddd9d0f3c7?d=identicon&s=25 Davis Dave (davisdave)
on 2015-11-10 18:44
ti ringrazio davvero molto per le dritte, il problema è che quel
'bisesitle' (che è un errore di battitura di bisestile) è un metodo che
utilizzo come variabile, in quanto restituisce dei valori true o false a
seconda che l' anno (birth1) sia bisestile o meno
birth2 è il mese mentre birth1 è l' anno, il programma chiede le tre
date e secondo l' esercizio dovrebbe verificare tramite l' oggetto Time
e time.mktime l' età e stampare a schermo la scritta ' spank' per ogni
anno. detto così è facilissimo, ma ci tenevo che fosse abbastanza
infallibile per quanto riguarda gli anni bisestili e le date 30/31 che
come ben sai cambiano per ogni mese ( ergo non vorrei che qualcuno
mettesse 31 a novembre e il programma andasse avanti), dunque
'bisesitle' identifica se l' anno è bisestile, birthday chiarisce se
quando si inserisce 30/31 quel mese sia effettivamente di 30 o 31
giorni, mentre bisrec identifica se a febraio viene messa una data
maggiore di 29 quando è bisestile o maggiore di 28 quando non lo è. per
bisrec servono i valori restituiti da bisestle, ecco tutto.
scusa se ti disturbo, ma mi sta davvero impegnando parecchio tempo e nn
mi fa andare avanti con lo studio di ruby
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2015-11-11 10:41
Ok, ho capito un po' di più il tuo ragionamento. Ecco un po' di
modifiche su cui ragionare e che faranno funzionare il tuo programma.

bisestile (rinominiamolo con il nome che dovrebbe avere - 6 errori di
battitura...) ritorna true o false, ma poi lo confronti con 'true' e
'false' che sono due stringhe. Questo non va bene come potrai capire da
solo.

Rinominiamo anche il parametro di bisrec che non può chiamarsi bisestile
come il metodo. Forse funziona ma di certo confonde chi legge. Diciamo
che diventa def bisrec(anno_bisestile)

birth1 birth2 birth3 dovrebbero chiamarsi anno, mese, giorno, e così
chiunque legga il programma capirebbe a cosa servono, anche tu tra sei
mesi.

Non usare or e and, usa || e &&. Non sono uguali e di solito vuoi
l'effetto che danno i secondi. Dove li usi tu sono equivalenti ma in
espressioni logiche più complesse potresti avere delle sorprese. Vedi
https://www.tinfoilsecurity.com/blog/ruby-demystified-and-vs

Il metodo bisestile si può scrivere più succintamente così

def bisestile(anno)
  anno.to_i % 4 == 0 || anno.to_i % 400 == 0
end

Questo non può funzionare:

bisestile(anno) # ok, funziona
bisrec(bisestile) # no, non funziona perché manca l'argomento di
bisestile

Meglio:

bisrec(bisestile(anno))

ma bisrec potrebbe chiamare bisestile direttamente al suo interno,
quindi meglio:

def bisrec(anno, mese)
  anno_bisestile = bisestile(anno)
  if anno_bisestile == true && mese.to_i == conta30[1].to_i
...

bisrec(anno, mese)

A questo punto si ha un errore perché conta30 è definita dentro a
birthday e quindi non è visibile dentro a bisrec.

Risolto quello vedrai che c'è un problema su

yrlive = dtbirth.to_i - newT.to_i

che è montata al contrario e dà valori negativi a meno che dtbirth non
sia nel futuro facendo fallire la * nella puts finale.

Inoltre ti ritorna i secondi, mentre volevi gli anni, ma questo è facile
da sistemare.


Se ti sembrano tanti errori o imperfezioni non ti preoccupare, agli
inizi è normale e ci siamo passati tutti. I più anziani di noi
spaccandosi la testa da soli sul tavolo perché non c'era internet su cui
chiedere consiglio :-)
138f094a9eba3379ce670fddd9d0f3c7?d=identicon&s=25 Davis Dave (davisdave)
on 2015-11-11 11:08
Inutile dire che davvero mi hai salvato! Grazie mille per il tuoi aiuto,
ne farò tesoro prezioso. Adesso so che ruby è difficile ma anche molto
bello, perciò vorrei impararlo bene. Scusa se ti disturbo ulteriormente
con le mie domande, ma potresti consigliarmi un buon libro per ampliare
le conoscenze e migliorare lo stile? Un giorno mi piacerebbe programmare
ad alto livello!

Grazie mille ancora per il tuo prezioso aiuto
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2015-11-11 12:24
Di libri Ruby non ne ho letti e in generale non compro più "carta"
tecnica da anni: è quasi obsoleta quando esce. Però su questo ci sono
vedute diverse e altri nel forum ti potranno consigliare perché so che
leggono libri.

Ci sono mille blog e mille siti. Per la style guide ti consiglio di
nuovo https://github.com/styleguide/ruby

Forse è un po' presto ma puoi anche tener d'occhio
http://rubyweekly.com/ e http://planetruby.herokuapp.com/ Se vedi
qualcosa che ti interessa approfondiscilo.

Leggere codice scritto da altri fa bene e anche googlare i propri
problemi. Ad esempio: "ruby years since" come primo risultato dà
http://stackoverflow.com/questions/1904097/how-to-...
This topic is locked and can not be replied to.