2013-11-26 11 views
5

Sto leggendo "Rails 3 Way" e a pagina 39, mostra un esempio di codice del metodo di reindirizzamento :to => della corrispondenza. In quel metodo esiste il seguente codice. Mentre so che cosa fa il modulo con i numeri, non sono sicuro di cosa stia facendo% in basso perché sia ​​il percorso che i parametri non sono chiaramente numeri. Se qualcuno può aiutarmi a capire l'uso di% in questa situazione, lo apprezzerei.Cosa fa% nel seguente codice?

proc { |params| path % params } 

risposta

10

Questo è probabilmente il metodo String#% che funziona un po 'come sprintf fa in altre lingue:

'%05d' % 10 
# => "00010" 

Si può prendere un singolo argomento o un array:

'%.3f %s' % [ 10.341412, 'samples' ] 
# => "10.341 samples" 

Aggiornamento: Come sottolinea Philip, questo metodo accetta anche un hash:

'%{count} %{label}' % { count: 20, label: 'samples' } 
# => "20 samples" 

Naturalmente, si presume che path sia una stringa. In Ruby non si sa mai con certezza se non si legge attentamente il codice. È improbabile, ma potrebbe essere % che significa modulo.

La cosa di cui si può essere certi è che sta chiamando il metodo % su path.

+0

downvoted perché non hai risolto cosa succede quando 'params' è un hash, che di solito è – Phlip

+0

@Phlip ho aggiunto una nota al riguardo. Grazie. – tadman

2

Fa interpolazione stringa. Nel caso più semplice, è equivalente a:

"foo %s baz" % 'bar' 
#=> "foo bar baz" 

Tuttavia, è possibile utilizzare identificatori di formato più complesse per interpolare da Array o Hash oggetti anche, come le rotaie params hash. Vedere i metodi String#% e Kernel#sprintf per dettagli su come costruire una specifica di formato valida.

+0

In particolare, il '" foo =% {foo} "% {: foo => 'bar'}' notation usa '% {pippo}' per espandere un hash per valore. Nota che alcune altre lingue avrebbero usato '% (foo) s' lì ... – Phlip

+0

@Phlip Questo è un ottimo esempio di come fare l'interpolazione usando le chiavi hash nell'identificatore di formato. Grazie per aver aggiunto un commento costruttivo! –