SCALAでINFIXメソッドコールとCons Operator(::)
-
02-10-2019 - |
質問
私はScalaプログラミング言語を非常に初めてであり、講義ノートをフォローしている間、私の心に何かを刺してみました ここ.
私はCons Operatorがどのように機能するかを本当に理解できなかったと思います、ここに私が試したいくつかのことがあります:
擬似ランダム番号ジェネレーターを作成し、1つのランダム値のリストを作成しようとしました。
scala> val gen = new java.util.Random
gen: java.util.Random = java.util.Random@1b27332
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
ただし、リスト(3)をNextNTメソッドに渡そうとしました。私がパラテスを使用したとき、問題はありませんでした
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
私は実行命令に興味があったので、それをチェックするための関数を作成しました
scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int
scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)
出力に見られるように、実行順序は外観の順序と同じです。それから私はそれが「nextint」関数に関するものかもしれないと思った後、次のことを試みました:
scala> 1 + 2 :: Nil
res72: List[Int] = List(3)
最初に追加され、その短所が実行された後。だからここに質問があります:の間の違いは何ですか gen nextInt 3 :: Nil
と 1 + 2 :: Nil
?
解決
ここには2つの懸念事項があります。 優先順位 と 固定性. 。 SEPP2Kが述べたように、Stack Overflowに関するこの質問は優先順位を説明し、引用されているように規則は十分に完全ではないと考え、Scala 2.7からScala 2.8への非常に小さな変更がありました。違いは、主に終了するオペレーターに関するものです =
, 、 けれど。
はどうかと言うと 固定性, 、Scalaのほとんどすべてが左から右に読まれます。これがプログラマーが慣れているものです。ただし、Scalaでは、オペレーターが終了します :
左に読まれます。
次に、この例を考えてみましょう。
1 + 2 :: Nil
まず、優先順位。最も優先されるものは、 +
また :
?テーブルによると、 +
優先順位があります :
, 、したがって、追加が最初に行われます。したがって、式はこれに等しくなります。
((1).+(2)) :: Nil
現在、優先順位の競合はありませんが、それ以来です ::
で終わります :
, 、それは異なる固定性を持っています。したがって、右に読まれます。
Nil.::((1).+(2))
一方、これで:
gen nextInt 3 :: Nil
オペレーター ::
優先順位があります nextInt
, 、 なぜなら :
すべての文字よりも優先されます。したがって、その固定性を覚えていると、次のようになります。
gen nextInt Nil.::(3)
それはそうなります
gen.nextInt(Nil.::(3))
その時点でエラーは明らかです。
PS:私は書いています (1).+(2)
それ以外の 1.+(2)
なぜなら、この執筆時点で、 1.
二重番号、作成として解釈されます 1.+(2)
Double 1.0を2に追加するInfix式は、SCALA 2.10.0の時点で非推奨であり、おそらくScala 2.11には存在しません。
他のヒント
それは、実行命令ではなく優先順位についてです。 +
よりも優先されます ::
, 、 それで a + b :: c
as (a + b) :: c
. 。ただし、通常の名前を持つInfixメソッド呼び出しの優先順位は低いため a foo b c
as a foo (b c)
.
見る この質問 Scalaで優先順位を付けることで注文されたオペレーターのリスト。