0
scala> val set = Set("apricot", "banana", "clementine", "durian", "fig", "guava", "jackfruit", "kiwi", "lime", "mango")
set: scala.collection.immutable.Set[java.lang.String] = Set(banana, durian, fig, jackfruit, lime, mango, clementine, apricot, kiwi, guava)

scala> set.partition(_ length > 5)
<console>:1: error: ')' expected but integer literal found.
       set.partition(_ length > 5)
                                ^

scala> set.partition(_.length > 5)
res5: (scala.collection.immutable.Set[java.lang.String], scala.collection.immutable.Set[java.lang.String]) = (Set(banana, durian, jackfruit, clementine, apricot),Set(fig, lime, mango, kiwi, guava))

誰かが私が実行するときになぜそれが文句を言うのか説明できますか

set.partition(_ length > 5)

私が実行するときではなく

set.partition(_.length > 5)

私もほとんど成功せずに次のことを試みました:

scala> set.partition((_ length) > 5)
<console>:9: error: missing parameter type for expanded function ((x$1) => x$1.length)
              set.partition((_ length) > 5)
                             ^
4

2 に答える 2

4

ドットをドロップすると、Scalaは1パラメーターメソッドがあると想定します。言い換えれば、それが1つの引数を必要とするメソッド、つまりその引数である_ length > 5と考えると、5をどうするかがわかりません。length>

これは、を書くときと似ていることに注意してください5 + 5。このステートメントは書くことと同じ5.+(5)ですが、ドットと括弧を削除しています。+Scalaはドットの欠落に気づき、それが単一の引数を必要とするメソッドであると(正しく)想定します。

自分で書く場合"abc" length、Scalaが引数であると想定するものは何もないので、Scalaはそれをlength必要としないことに気づきます。

それで:

"abc".length        // fine
"abc" length        // fine
"abc".length > 4    // fine
("abc" length) > 4  // fine
"abc" length > 4    // error!

したがって、コンパイラにそのことを伝え、一緒に実行して追加の引数を持たないようにするには、ドットまたは括弧のいずれかが必要"abc"ですlength

コーディングスタイルの観点から、ゼロ引数メソッドには常にドットを使用することをお勧めします。私はそれがより読みやすく、このようなコンパイルエラーを回避するのに役立ちます。

于 2012-05-11T16:00:08.333 に答える
3

あなたが書くとき:

set.partition(_ length > 5)
//            ^ object
//              ^ method
//                     ^ parameter

length1つのパラメータを受け取るメソッドとして扱います>

あなたが書くとき:

set.partition(_.length > 5)
//            ^------^ object
//                     ^ method
//                       ^ parameter 

_.lengthオブジェクトとして扱われ>、パラメータであり5、引数です。

于 2012-05-11T15:59:52.077 に答える