2

Scalaでのプログラミングから、foreachこれは戻り型のプロシージャを受け取る高階関数であることがUnitわかります。したがって、次のスライスが機能すると思います。

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

しかし、それは私にそれを教えてくれます:

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

しかし、以下の2つは両方ともうまく機能します。

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

では、違いは何ですか?

4

2 に答える 2

3

これら2つは_異なる方法で使用しています:

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

_最初のケースでは、パラメータのプレースホルダーを示す無名関数があります。

2番目のケースでは、メソッドの関数値(eta展開_)が必要であることを意味します。print

したがって、2つを比較することは関係ありません。

もっと要点はこれでしょう:

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

ご覧のとおり、これは機能しないため、に置き換えることも機能"abcde"しません_

于 2012-06-05T22:18:50.293 に答える
2

_以来、この状況では使用できません

abcde.foreach(print _.toUpperCase)

として解釈することはできません

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

(がprint返されるためUnit)そしてそれは次のように解釈することはできません

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

print文字列から文字列への関数をとらないためです。

少し長くする必要があります

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

これは正常に動作します。

[...]しかし、以下の2つは両方ともうまく機能します:[...]

両方

println("abcde".toUpperCase)

abcde.foreach(print _)

それを書くための完全に素晴らしいそして標準的な方法です。違いは_、最初の試みが示すように、引数内で使用できないことです。

于 2012-06-05T14:44:37.200 に答える