2010-08-18 13 views
20

if counter % 2 == 1 Sto provando a decodificare questa linea - si tratta di un progetto Rails e sto cercando di capire cosa fa il % in questa istruzione if.Che cosa significa l'operatore% fare in Ruby in N 2%?

+1

odora qualcosa per verificare la presenza di valori dispari del contatore. –

+1

Un piccolo puzzle per te: in C#, il test che fai non * controlla * in modo affidabile se il contatore è dispari. Qualcuno capisce perché?(Suggerimento: in Ruby, qual è la differenza tra il resto e i metodi modulo sui numeri?) –

+0

Utilizza anche per sostituzioni di stringhe - http://ruby-doc.org/core/classes/String.html#M000770 –

risposta

40

% è l'operatore modulo. Il risultato della counter % 2 è il resto della counter/2.

n % 2 è spesso un buon metodo per determinare se il numero n è pari o dispari. Se n % 2 == 0, il numero è pari (perché senza resto significa che il numero è divisibile per 2); se n % 2 == 1, il numero è dispari.

+0

Si * certo * riguardo a quest'ultima richiesta? Questo è vero in Ruby ma non in altre lingue! –

+0

@Eric cosa non è vero? Non ho detto che è l'unico modo migliore per determinare se un numero è pari o dispari ... –

+0

Quello che intendevo era che il test n% 2 == 1 * in realtà non determina se un numero è dispari * in molti le lingue. Ad esempio in C# determina se un numero è * sia positivo che dispari *, che è diverso. –

2

Questo è l'operatore modulo. Esso fornisce il resto quando il contatore è diviso per 2.

For example: 
3 % 2 == 1 
2 % 2 == 0 
0

È l'operatore modulo, che è un modo elegante per dire che è l'operatore resto.

Quindi se hai diviso un numero per due, e il resto intero di quel numero è uno, allora sai che il numero era dispari. Il tuo esempio controlla i numeri dispari.

Spesso questo viene fatto per evidenziare righe di numeri dispari con un colore di sfondo diverso, rendendo più facile leggere grandi elenchi di dati.

0

Per dare alcuni modi per dirlo:

  • Modulo operatore
  • operatore Resto
  • residuo modulare

rigor di termini, se a % b = c, c è la costante unico modo che

a == c (mod b) e 0 <= c < b

Dove x == y (mod m) iff x - y = km per alcuni costante k.

Ciò equivale al resto. Secondo alcuni noti teoremi, abbiamo lo a = bk + c per alcuni costanti , dove c è il resto, che ci dà a - c = bk, che ovviamente implica a == c (mod b).

(C'è un modo per utilizzare LaTeX su StackOverflow?)

0

Questa è una domanda molto semplice. % è il modulo opereator if counter % 2 == 1 risultati per true per ogni numero dispari e per false per ogni numero pari.

Se stai imparando rubino si dovrebbe imparare a utilizzare irb, lì si può provare le cose e forse rispondere alla domanda se stessi.

tenta di immettere

100.times{|i| puts "#{i} % 2 == 1 #=> #{i % 2 == 1}"} 

nella vostra console irb IRB e vedere l'uscita, quello che dovrebbe essere chiaro che cosa % fa.

E si dovrebbe davvero dare un'occhiata alla documentazione rotaie api (1.9, 1.8.7, 1.8.7), non ci si sarebbe trovato la risposta a due tua domanda % (Fixnum) con un ulteriore collegamento ad una descrizione dettagliata del divmod (Numeric):

Restituisce una matrice contenente il quoziente e il modulo ottenuto dividendo num per unNumero. > Se q, r = x.divmod (y), quindi

q = floor(float(x)/float(y)) 
x = q*y + r 

Il quoziente viene arrotondato verso -infinito, come mostrato nella seguente tabella:

a | b | a.divmod(b) | a/b | a.modulo(b) | a.remainder(b) 
------+-----+---------------+---------+-------------+--------------- 
13 | 4 | 3, 1  | 3  | 1  |  1 
------+-----+---------------+---------+-------------+--------------- 
13 | -4 | -4, -3  | -3  | -3  |  1 
------+-----+---------------+---------+-------------+--------------- 
-13 | 4 | -4, 3  | -4  | 3  | -1 
------+-----+---------------+---------+-------------+--------------- 
-13 | -4 | 3, -1  | 3  | -1  | -1 
------+-----+---------------+---------+-------------+--------------- 
11.5 | 4 | 2, 3.5 | 2.875 | 3.5  |  3.5 
------+-----+---------------+---------+-------------+--------------- 
11.5 | -4 | -3, -0.5 | -2.875 | -0.5  |  3.5 
------+-----+---------------+---------+-------------+--------------- 
-11.5 | 4 | -3, 0.5 | -2.875 | 0.5  | -3.5 
------+-----+---------------+---------+-------------+--------------- 
-11.5 | -4 | 2 -3.5 | 2.875 | -3.5  | -3.5 

Esempi

11.divmod(3)   #=> [3, 2] 
11.divmod(-3)  #=> [-4, -1] 
11.divmod(3.5)  #=> [3, 0.5] 
(-11).divmod(3.5) #=> [-4, 3.0] 
(11.5).divmod(3.5) #=> [3, 1.0] 
1

Indipendentemente da come funziona, l'operatore modulo non è probabilmente il miglior codice per lo scopo (anche se non viene fornito un contesto molto ampio). Come ha detto Jörg in un commento, l'espressione if counter.odd? è probabilmente l'intento ed è più leggibile.

Se si tratta di codice di visualizzazione e utilizzato per determinare (ad esempio) colori di riga alternati, è possibile che si possa fare a meno del contatore utilizzando l'helper Rails incorporato cycle(). Ad esempio, è possibile utilizzare cycle('odd','even') come nome di classe per una riga della tabella, eliminando il contatore e la logica if/then circostante.

Un altro pensiero: se questo è all'interno di un blocco each, potresti essere in grado di utilizzare each_with_index ed eliminare la variabile contatore estraneo.

Il mio refactoring $ 0,02.

0

Inoltre, tenere presente che la definizione di Ruby dell'operatore modulo (%) differisce da quella di C e Java. In Ruby, -7%3 è 2. In C e Java, il risultato è -1. In Ruby, il segno del risultato (per l'operatore %) è sempre uguale al segno del secondo operando.

37

In risposta alla domanda "Che cosa fa o significa il simbolo% in Ruby?" È:

1) L'operatore binario modulo (come è stato detto)

17 % 10 #=> 7 

2) La stringa alternativa delimitatore di token

%Q{hello world} #=> "hello world" 
%Q(hello world) #=> "hello world" 
%Q[hello world] #=> "hello world" 
%Q!hello world! #=> "hello world" 
# i.e. choose your own bracket pair 
%q(hello world) #=> 'hello world' 
%x(pwd)   #=> `pwd` 
%r(.*)   #=> /.*/ 

3) L'operatore formato stringa (abbreviazione per Kernel :: sprintf)

"05d" % 123 #=> "00123" 
+8

+1 per essere l'unico a menzionare l'operatore di formato stringa. Questa era la particolare risposta che stavo cercando. – nocash