Sto tentando di Problem 6 in Project Euler in Ruby (nel mio tentativo di imparare la lingua), e qui è quello che mi è venuta nella prima iterazione:Perché Ruby si lamenta di "metodo non definito` + 'per nil: NilClass (NoMethodError) "solo quando uso un condizionale' if '
upto = 10
a = (1..upto).to_a.product((1..upto).to_a)
#a.each{ |x| print "(#{x[0]}, #{x[1]})\n"}
puts a.inject(0) {|sum, x| sum + x[0]*x[1] if (x[0] != x[1])}
Purtroppo, che getta il seguente errore su Ruby 2.0:
in
block in <main>': undefined method
+' per nil: NilClass (NoMethodError)
Ancora più sconcertante è che l'errore non si verifica quando rimuovo il caso condizionale (che ovviamente mi dà la risposta sbagliata btw!)
upto = 10
a = (1..upto).to_a.product((1..upto).to_a)
a.each{ |x| print "(#{x[0]}, #{x[1]})\n"}
puts a.inject(0) {|sum, x| sum + x[0]*x[1]} #if (x[0] != x[1])}
Quanto sopra ha pronunciato la seguente uscita (dopo la stampa gli elementi di una):
Come passo il debug, ho anche stampato il contenuto della 'a', per garantire che non vi siano elementi nil - che si è rivelato soddisfacente. Qualcuno potrebbe spiegare
- Che cosa sto facendo di sbagliato qui?
- Perché la differenza quando escludo il condizionale "se", poiché il messaggio di errore è nell'operatore "+" che altrimenti viene eseguito incondizionatamente?
EDIT: Sarebbe anche bello ricevere commenti su modi alternativi, più eleganti per ottenere la stessa soluzione, come mi piacerebbe sapere il modo standard con cui un Rubyista risolverebbe questo!
quale dovrebbe essere l'output del tuo codice? È '2640'? –
@Priti: (1..upto)^2 - (1^2 + 2^2 ... fino a^2) – TCSGrad
Non trovarti, ho un codice, voglio condividerti, basta confermarmi. '1^2 + 2^2 + 3^2 = 14'. Vuoi questa valutazione? –