2013-05-22 4 views
5

Sto usando il seguente codice per soddisfare le mie esigenze:Scala parametro non legato segnaposto

(1 to 5)..map(i => s"\\x${i}") // Produces List("\\x1", "\\x2", "\\x3", "\\x4", "\\x5") 

Ma vorrei usare un segnaposto. Secondo the string interpolator documentation:

(1 to 5).map(s"\\x${_}") 

dovrebbe espandersi a:

(1 to 5).map(StringContext("\\\\x","").s(_)) 

Ma questi ultimi lavori, non il primo, che getta un error: unbound placeholder parameter su _. Perché?

risposta

10

Credo che con la sintassi:

(1 to 5).map(s"\\x${_}") 

Il compilatore ritiene che il _ appartiene alla funzione s nel qual caso non funzionerà. Si può facilmente risolvere questo facendo qualcosa di simile:

(1 to 5).map(i => s"\\x${i}") 

si potrebbe desiderare di avere uno sguardo a questo link per maggiore chiarezza sulle regole per segnaposto in relazione alle funzioni anonime.

EDIT: Secondo questo post, la sintassi segnaposto utilizzato per lavorare, così forse questo è un errore di regressione o una funzione che non è mai stato destinato a lavorare in questo modo: https://groups.google.com/forum/#!msg/scala-internals/G_54LGj0zpg/REZfyXZ6-RwJ

+0

ho aggiunto la soluzione che ero già usando direttamente nella mia domanda. Mi piacerebbe avere più di credenze se possibile. 's' non è una funzione, è una funzione scala. –

+1

@ MikaëlMayer bene, no, non è una funzione linguistica. È definito qui: http://www.scala-lang.org/api/current/#scala.StringContext Puoi anche usare raw "", f "" o anche creare i propri interpolatori di stringa (json "", sql "", ...) – VasyaNovikov