2013-04-17 8 views
6

Nel repl, questo genera un'eccezione e non so perché. Mi piacerebbe davvero capirlo.Perché scala (da 1 a 1000) .foreach genera un'eccezione in questo caso?

scala> (1 until 10000).foreach("%s%s".format("asdf", "sdff")) 
java.lang.StringIndexOutOfBoundsException: String index out of range: 8 
    at java.lang.String.charAt(String.java:686) 
    at scala.collection.immutable.StringLike$class.apply(StringLike.scala:54) 
    at scala.collection.immutable.WrappedString.apply(WrappedString.scala:32) 
    at scala.collection.immutable.WrappedString.apply(WrappedString.scala:32) 
    at scala.collection.immutable.Range.foreach(Range.scala:75) 
+0

'(1 fino a 10000) .foreach (_ =>"% s% s ".format (" asdf "," sdff "))' è quello che stai cercando di fare – sourcedelica

risposta

11

codice Trattare sotto pseudocodice come unwrapped:

val str = "%s%s".format("asdf", "sdff") 
// "asdfsdff" you see, only 8 characters 
(1 until 10000).foreach(x => str.getCharAt(x)) 
+1

Infatti, 'str.apply' è chiamato e non 'str.getCharAt'. – sschaef

+0

@sschaef sì, è per questo che ho detto * pseudocode * ;-) –

+0

Om-nom-nom ha risposto per primo, così gli darò il punto. – JasonG

7

Strings in scala può essere utilizzato come funzioni da un indice del carattere in corrispondenza dell'indice proposta:

val s: Int => Char = "abcd" 
val c: Char = s(1) 

Questo è un meccanismo generale in Scala in cui un oggetto con un metodo apply può essere trattato come una funzione. Il metodo apply per le stringhe è definito in StringOps.

La stringa "asdfsdff" viene passata a foreach e ogni valore successivo nell'intervallo viene passato alla funzione. Ciò genera un'eccezione quando l'indice raggiunge 8 poiché questo è fuori intervallo.

+0

Per essere chiari, non è possibile trattare qualsiasi oggetto con un metodo 'apply' come funzione. Deve esserci una funzione di conversione implicita nell'ambito per poterlo usare come tale. Qui, è 'implicit def wrapString (s: String): WrappedString' su' Predef', poiché 'WrappedString' eredita da' PartialFunction [Int, Char] '. –

+0

Om-nom-nom ha risposto per primo, così gli darò il punto. Grazie per aver risposto - Ho upvoted. – JasonG

Problemi correlati