2015-11-27 12 views
5

Nel libro Cooper Rubino iniziale, pagina 166 c'è un esempio che non riesco a riprodurre.# tra? errore o anomalia in Cooper * Beginning Ruby *

class Song 
    include Comparable 

    attr_accessor :length 
    def <=>(other) 
    @length <=> other.length 
    end 

    def initialize(song_name, length) 
    @song_name = song_name 
    @length = length 
    end 
end 

a = Song.new('Rock around the clock', 143) 
b = Song.new('Bohemian Rhapsody', 544) 
c = Song.new('Minute Waltz', 60) 

a.between?(b, c) 

Nel libro, si dice il risultato dovrebbe essere => true mentre sto ottenendo => false.

ho continuato a rompere verso il basso per ...

puts 143.between?(544, 60) # => false 
puts 143.between?(60, 544) # => true 

E secondo ruby-doc.org, si suppone di essere scritto come between?(min,max) - il che mi porta a credere

  • a) il libro ha un errore
  • b) in una versione precedente di Ruby, tra? era più flessibile e permessi (max,min)
  • c) questo esempio è in qualche modo anomalo e sto manca qualcosa

Che è?

+3

... in pratica * a) * ... – ndn

+0

Il libro non dice quale versione di Ruby è basata? Se è così, puoi confrontarlo con DRoc di quella versione. Immagino sia a). – sawa

+0

Ciao! Scritto dall'autore :-) L'ho appena visto nell'edizione del 2009 (edizione 2, l'ultima al momento, anche se l'edizione 3 è prevista per il prossimo anno) e l'esempio lo mostra come tra parentesi (c, b), quindi funziona correttamente Tuttavia, non posso verificare se l'edizione 1 (2007) ha riportato l'errore che stai segnalando fino a quando non sono in ufficio, perché potrei averne una copia lì. :-) L'edizione 2 può essere vista in PDF per http : //no.gd/begruby22.pdf BTW. –

risposta

2

Questo è stato trattato in alcuni commenti sopra, ma come autore del libro volevo chiarire che l'edizione 2009 (edizione 2) del libro aveva corretto questo problema. Il poster originale ha aggiornato che stavano leggendo l'edizione 2007 :-)

Come risposta definitiva alla domanda, tuttavia, sì, la prima edizione del libro era errata.

4

Dopo un'indagine rapida, sembra che sia solo un errore nel libro (se lo citate correttamente).

Ho trovato il libro in pdf here. Sfortunatamente, manca la pagina 166. Tuttavia, a pagina 5, dice:

Nella sezione "Ruby on Windows", verranno visualizzati alcuni collegamenti per diverse versioni di Ruby che è possibile scaricare per Windows. Idealmente, si desidera scaricare il file al collegamento che è il più alto nell'elenco denominato "One-Click Installer". Al momento della scrittura, questa versione è 1.8.5.

Controllo CRuby's 1.8.5 Comparable implementation, si può vedere chiaramente che between? funziona il modo in cui lo fa oggi.

+0

Sono stato in grado di trovare un pdf che conteneva la pagina 166/167, e sembra che l'OP stia citando quella parte correttamente. –

+0

Paul: Dove? L'ho appena visto nell'edizione 2009 (edizione 2) e l'esempio si presenta come tra.? (C, b), quindi funziona correttamente. Non riesco a controllare se l'edizione 1 ha avuto l'errore, visto che non ho quel PDF, quindi mi piacerebbe vedere se si trattava di un errore dell'edizione 1 che abbiamo risolto nel 2009 :-) L'edizione 2 può essere vista in PDF per http://no.gd/begruby22.pdf BTW. –

+0

@PeterCooper Ciao Peter, il pdf che ho trovato era [qui] (ftp://ftp.cmpe.emu.edu.tr/COURSES/Cmpe418/Apress%20-%20Beginning%20Ruby%20-%20From%20Novice%20to % 20Professiona% 20 (2007) .pdf). Sembra che sia la versione 2007 che ho trovato. Ecco un'immagine [della pagina in questione] (http://imgur.com/9vGvYvz). Sembra che l'errore sia stato effettivamente corretto tra le edizioni! :) –

2

Volevo solo mostrarvi questo. Questo è il C-source per il metodo between?:

   static VALUE 
cmp_between(VALUE x, VALUE min, VALUE max) 
{ 
    if (RTEST(cmp_lt(x, min))) return Qfalse; 
    if (RTEST(cmp_gt(x, max))) return Qfalse; 
    return Qtrue; 
} 

Mentre io non guardo ogni singola versione, credo che questo metodo è rimasto invariato dal rubino 1.8.7.

Il cmp_lt e cmp_gt in inglese semplice sono "confronta meno di" e "confronta maggiore di".

Quindi, come si può vedere, il metodo restituirà false se il valore x, che nel tuo caso sarebbe la lunghezza a oggetti di 144, è inferiore al minimo, che sarebbe durata 544 's b . Dal 144 < 544, stai ricevendo la risposta corretta, e sembra che il libro contenga un errore.

Non riesco a determinare se questo errore sia mai stato segnalato in precedenza, quindi se siete inclini, potrebbe essere utile contattare l'autore e farglielo sapere.

+0

'cmp_lt' e' cmp_gt' non significano "confronta meno di" e "confronta maggiore di". Significano "meno rispetto al modulo comparabile" e "maggiori rispetto al modulo comparabile". – sawa