sto utilizzando timeout() per ottenere un effettivo timeout
in una connessione di rete. Se specifico direttamente i secondi
in questa maniera timeout(5) funziona, mentre con timeout("#{timeout}")
non funziona… mmh… dove sbaglio?
ho letto alcuni esempi di utilizzo di getopts, e visto la mia poca
esperienza, non riesco a capire cosa voglia dire ad esempio il “.to_i”
in $OPT_y.to_i
Su perl esiste una cosa del genere:
$i = 0;
while ($i < 18) {
print "$i ";
$i++;
}
Ma su ruby esiste il $i++; (cioè come si aumenta di 1 unità) ??
Ciao Cristiano,
puoi usare i += 1 (occhio che =+ non è la stessa cosa).
In termini di stile, si preferisce l’uso di iteratori piuttosto che
cicli
con un contatore che si autoincrementa di uno. (ad esempio 18.times{|i|
puts
i} oppure 0.upto(17){|i| puts i})
Antonio
PS: ti consiglio di fare amicizia con irb, che ti permette di
sperimentare e
chiarire dubbi.
Cioè, come l’hai scritto tu, è sempre una sola chiamata a to_i() che
viene eseguita?
L’espressione tra parentesi vale 5 solo e soltanto se $OPT_T è false,
dico bene? Quindi se l’utente ha inserito “pippo”, a timeout verrà
assegnato “pippo”.to_i , e cioè 0 (zero l’integer, cioè NON false). Il
programma dovrebbe quindi comunque controllare che $OPT_T è un numero.
A questo punto il mondo si e’ gia’ diviso in 10 (in base 2) categorie
di persone. Io appartengo alla seconda, quella di chi ancora non ci
era arrivato, mentre altri fra voi si staranno facendo grasse risate.
Ad ogni modo, ho appreso una serie di cose utili:
La sintassi di Ruby e’ veramente molto, molto liberale, ma Matz ha
preferito non guastarla con zucchero inutile.
Non e’ Ruby che e’ pazzo, ma io che so’ stupido (sia perche’ le *
dovevano insospettirmi, sia perche’ lo sapevo che qualsiasi
espressione DEVE ritornare qualcosa)
Che in genere e’ meglio non usare l’operatore ++, dato che
effettivamente non esiste, ma in alcuni contesti fa finta di si
Che irb e’ veramente utile, si scoprono sempre cose interessanti!
timeout = ($OPT_T || 5).to_i
usage if $OPT_T !~ /\d/
grazie
david wrote:
O è °i?iciente
timeout = ($OPT_T.to_i || 5)
?
Cioè¬ come l’hai scritto tu, è ³empre una sola chiamata a to_i() che
viene eseguita?
L’espressione tra parentesi vale 5 solo e soltanto se $OPT_T è ¦alse,
dico bene? Quindi se l’utente ha inserito “pippo”, a timeout verrà ?assegnato “pippo”.to_i , e cioè ° (zero l’integer, cioè ?ON false). Il
programma dovrebbe quindi comunque controllare che $OPT_T è µn numero.
possibile che non funziona? Mi torna sempre usage…
Jack C. wrote:
Ciao,
una cosa del genere puo’ andare?
timeout = ($OPT_T || 5).to_i
usage if $OPT_T !~ /\d/
grazie
david wrote:
O è °i?iciente
timeout = ($OPT_T.to_i || 5)
?
Cioè¬ come l’hai scritto tu, è ³empre una sola chiamata a to_i() che
viene eseguita?
L’espressione tra parentesi vale 5 solo e soltanto se $OPT_T è ¦alse,
dico bene? Quindi se l’utente ha inserito “pippo”, a timeout verrà ?assegnato “pippo”.to_i , e cioè ° (zero l’integer, cioè ?ON false). Il
programma dovrebbe quindi comunque controllare che $OPT_T è µn numero.
Che in genere e’ meglio non usare l’operatore ++, dato che
effettivamente non esiste, ma in alcuni contesti fa finta di si
Ciao Luca,
ti spiego cosa accade, per te o per i viaggiatori nel cronotopo di
google
Le parentesi opzionali in Ruby possono portare a comportamenti
inaspettati,
se non si fa attenzione.
irb(main):001:0> i = 1
=> 1
irb(main):002:0> i++
irb(main):003:0* i
=> 2
In Ruby non esiste l’operatore ++. Quello che stai facendo è equivalente
a:
irb(main):001:0> i = 1
=> 1
irb(main):002:0> i+(+
irb(main):003:1* i)
=> 2
irb(main):004:0> i
=> 1
In pratica il secondo + diventa parte dell’argomento per il primo
operatore
+. Quando premi invio, irb aspetta ancora un valore da affiancare a quel
secondo + per completare l’argomento che deve essere di tipo numerico.
Nel
momento in cui scrivi i e premi invio, quello che ottieni è il seguente:
i+(+i) = 1+(+1) = 2. Per cui stai semplicemente calcolando 1+1, ma non
fai
alcun assegnamento alla variabile i che rimane 1, come puoi notare dalla
mia
sessione irb.
Applicando lo stesso ragionamento alla tua sessione:
Verifichi facilmente che equivale a dire, i+(+i+(+i+(+i))) =
9+(+9+(+9+(+9))) = 36. Si tratta di una semplice somma, quindi il valore
di
i, rimane inalterato (9).
“1”.to_i *2: qual’è il suo valore? Provalo in irb e vedrai che vale 1.
“1”.to_i *2: qual’è il suo valore? Provalo in irb e vedrai che vale 1.
Questa non l’ho capita.
Togliendo lo spazio restituisce 2, con lo spazio 1, come mai?
Ciao Alessio,
se aggiungi uno spazio tra * e 2, o rimuovi lo spazio tra to_i e *, stai
semplicemente calcolando “1”.to_i * 2 = 1 * 2 = 2. E fin qui nulla di
strano.
Quando calcoli “1”.to_i *2, si ottiene 1. La spiegazione è abbastanza
semplice:
“1”.to_i *2 equivale a “1”.to_i(*2).
Il metodo String#to_i accetta una valore intero che ne specifica la base
numerica (per cui “110”.to_i(2) restituisce 6).
L’asterisco usato come ‘operatore’ unario, è un ‘array expansion argument
specifier’ come lo ha definito matz. In altre parole espande un array
quando
lo si passa come argomento: