2 Stimmen

Warum foreach mit String typisierte Liste mit toUpperCase fehlschlagen?

から Programmieren in Scala ,wir wissen, dass foreach ist eine Funktion höherer Ordnung, die eine Prozedur mit Rückgabetyp Unit Daher denke ich, dass die folgende Scheibe funktionieren würde:

val abcde = List("a","b","c","d","e")
abcde.foreach(print _.toUpperCase)

aber es sagt mir, dass:

1: error: ')' expected but '.' found.
  abcde foreach (println _.toUpperCase)
                          ^

Aber diese beiden unten genannten funktionieren beide gut:

println("abcde".toUpperCase)
abcde.foreach(print _)

Worin besteht also der Unterschied?

3voto

Daniel C. Sobral Punkte 290004

Diese beiden benutzen _ auf unterschiedliche Weise:

abcde.foreach(print _.toUpperCase)
abcde.foreach(print _)

Im ersten Fall haben Sie eine anonyme Funktion, bei der _ steht für einen Platzhalter für einen Parameter.

Im zweiten Fall, _ bedeutet, dass Sie einen Funktionswert für die Methode print (an eta-Erweiterung ).

Es ist also irrelevant, die beiden zu vergleichen.

Der Punkt ist eher der folgende:

scala> print "abcde".toUpperCase
<console>:1: error: ';' expected but string literal found.
       print "abcde".toUpperCase
             ^

Wie Sie sehen können, funktioniert das nicht, also ersetzen Sie "abcde" mit _ würde auch nicht funktionieren.

2voto

aioobe Punkte 397211

Sie können nicht verwenden _ in dieser Situation, da

abcde.foreach(print _.toUpperCase)

kann nicht interpretiert werden als

abcde.foreach((print _).toUpperCase)
              ^       ^

(seit print gibt zurück. Unit ) und kann nicht interpretiert werden als

abcde.foreach(print (_.toUpperCase))
                    ^             ^

parce que print nimmt keine Funktion von String zu String.

Sie müssen die etwas längere

abcde.foreach(s => print(s.toUpperCase))

was gut funktioniert.

[...] Aber die beiden folgenden funktionieren beide gut: [...]

Beide

println("abcde".toUpperCase)

y

abcde.foreach(print _)

sind völlig in Ordnung und die übliche Art, sie zu schreiben. Der Unterschied ist, dass _ kann nicht innerhalb eines Arguments verwendet werden, wie Ihr erster Versuch zeigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X