快学Scala第11章----オペレータ
4197 ワード
この章の要点識別子は、アルファベット、数値、または演算子で構成される. 一元オペレータと二元オペレータは、実はメソッド呼び出し である.オペレータの優先度は最初の文字に依存し、結合性は最後の文字 に依存する. applyメソッドおよびupdateメソッドは、expr(args)式の評価時に呼び出される. 抽出器は、入力からメタグループまたは値のシーケンスを抽出する.
識別子
変数、関数、クラスなどの名前を識別子と統一する.Scalaでは選択肢が多く、アルファベット、数字、様々な演算子で構成できますが、意味が明確でない場合は勝手に使用しない(個人的にはC++やJavaの規定を使用すると思います:識別子はアルファベット、数字、下線で構成されており、数字は最初として使用できません.このように統一され、わけのわからない意味もありません)、例えば、あなたの識別子は:!#%&*文法の間違いはありませんが、それが何を表しているのか理解しにくいです.
**注意:**反引用符には、次のような特質的な用途があります.
[中央](Middle)オペレータ
中置オペレータは2元で、2つのパラメータがあります.
オペレータを再定義して再ロードすることもできます.これはC++やJavaと同じです.
一元オペレータ
メタオペレータには1つのパラメータしかありません.
割り当てオペレータ
技術の詳細:<=、>=および!=判断識別子であり、付与オペレータではない =で始まるオペレータは割り当てオペレータではありません(=,===,=,=/=) aが=というオペレータを書き換えた場合、このメソッドは に直接呼び出される.
優先度
Scalaの中オペレータ優先度はC++、Javaと同じですが、オペレータの先頭文字によって決まります.
けつごうせい
Scalaでは、すべてのオペレータが左に結合されています.コロン(:)で終わるオペレータ 割り当てオペレータ例:
applyとupdateメソッド
Scalaでは、次の関数呼び出し方法を使用できます.
前の伴生オブジェクトでは、applyメソッドは、表示せずにnewを使用してオブジェクトを構築するために使用されます.これは複雑な式で役立ちます.
ちゅうしゅつき
抽出はunapplyメソッド付きオブジェクトであり,伴生オブジェクトのapplyメソッドとは正反対である.applyは構造パラメータを受け入れ、オブジェクトに構築します.一方、unapplyメソッドは、オブジェクトを受け入れ、そこから値を取得します.通常、これらの値は、オブジェクトを構築するために当初使用された値です.
抽出器を使用して、任意のタイプのペアから情報を抽出できます.
単一のパラメータまたはパラメータなしの抽出器
Scalaでは、1つのコンポーネントのみを持つメタグループはありません.unapplyメソッドで単一の値を抽出する場合は、ターゲットタイプのOptionを返す必要があります.
パラメータのない抽出器:実際に抽出されずに入力をテストするだけで、unapplyメソッドはBooleanを返します.
unapplySeqメソッド
任意の長さの値のシーケンスを繰り上げるには、unapplySeqメソッドを使用します.
識別子
変数、関数、クラスなどの名前を識別子と統一する.Scalaでは選択肢が多く、アルファベット、数字、様々な演算子で構成できますが、意味が明確でない場合は勝手に使用しない(個人的にはC++やJavaの規定を使用すると思います:識別子はアルファベット、数字、下線で構成されており、数字は最初として使用できません.このように統一され、わけのわからない意味もありません)、例えば、あなたの識別子は:!#%&*文法の間違いはありませんが、それが何を表しているのか理解しにくいです.
**注意:**反引用符には、次のような特質的な用途があります.
val 'val' = 42 // Scala ,
// ,Java Thread yield , Scala yield :
Thread.'yield'() //
[中央](Middle)オペレータ
中置オペレータは2元で、2つのパラメータがあります.
a b
//
1 to 10
//
1.to(10)
オペレータを再定義して再ロードすることもできます.これはC++やJavaと同じです.
一元オペレータ
メタオペレータには1つのパラメータしかありません.
a
//
1 toString
//
1.toString()
割り当てオペレータ
a = b
//
a = a b
//
a += b
技術の詳細:
優先度
Scalaの中オペレータ優先度はC++、Javaと同じですが、オペレータの先頭文字によって決まります.
* / % ---> + - ---> : ---> < > ---> != ---> & ---> ^ ---> | ---> --->
けつごうせい
Scalaでは、すべてのオペレータが左に結合されています.
1 :: 2 :: Nil //
1 :: (2 :: Nil) //
applyとupdateメソッド
Scalaでは、次の関数呼び出し方法を使用できます.
f(arg1, arg2, ...)
// f , :
f.apply(arg1, arg2, ...)
f(arg1, arg2, ...) = value
f.update(arg1, arg2, ..., value) //
···
map 。
``` scala
val scores = new scala.collection.mutable.HashMap[String, Int]
scores("Bob") = 100 // scores.update("Bob", 100)
val bobsScore = scores("Bob") // scores.apply("Bob")
前の伴生オブジェクトでは、applyメソッドは、表示せずにnewを使用してオブジェクトを構築するために使用されます.これは複雑な式で役立ちます.
class Fraction(n: Int, d: Int) {
...
}
object Fraction {
def apply(n: Int, d: Int) = new Fraction(n, d)
}
val result = Fraction(3, 4) * Fraction(2, 5) // new
ちゅうしゅつき
抽出はunapplyメソッド付きオブジェクトであり,伴生オブジェクトのapplyメソッドとは正反対である.applyは構造パラメータを受け入れ、オブジェクトに構築します.一方、unapplyメソッドは、オブジェクトを受け入れ、そこから値を取得します.通常、これらの値は、オブジェクトを構築するために当初使用された値です.
object Fraction {
def apply(n: Int, d: Int) = new Fraction(n, d)
def unapply(input: Fraction) = {
if (input.den == 0) None else Some((input.num, input.den))
}
}
var Fraction(a, b) = Fraction(3, 4) * Fraction(2, 5) // a 3*2, b 4*5
抽出器を使用して、任意のタイプのペアから情報を抽出できます.
// Name String , Name
object Name {
def unapply(input: String) = {
val pos = input.indexOf(" ")
if (pos == -1) None
else Some((input.substring(0, pos), input.substring(pos + 1)))
}
}
val author = "Cay Horstmann"
val Name(first, last) = author
単一のパラメータまたはパラメータなしの抽出器
Scalaでは、1つのコンポーネントのみを持つメタグループはありません.unapplyメソッドで単一の値を抽出する場合は、ターゲットタイプのOptionを返す必要があります.
object Number {
def unapply(input: String): Option[Int] = {
try {
Some(Integer.parseInt(input.trim))
} catch {
case ex: NumberFormatException => None
}
}
}
val Number(n) = "1729"
パラメータのない抽出器:実際に抽出されずに入力をテストするだけで、unapplyメソッドはBooleanを返します.
object IsCompound {
def unapply(input: String) = input.contains(" ")
}
// :
author match {
case Name(first, last @ IsCompound()) => ...
case Name(first, last) => ...
}
unapplySeqメソッド
任意の長さの値のシーケンスを繰り上げるには、unapplySeqメソッドを使用します.
object Name {
def unapplySeq(input: String): Option[Seq[String]] = {
if (input.trim == "") None
else Some(input.trim.split("\\s+"))
}
}
//
author math {
case Name(first, last) => ...
case Name(first, middle, last) => ...
case Name(first, "van", "der", last) => ...
...
}