快学Scala第11章----オペレータ

4197 ワード

この章の要点
  • 識別子は、アルファベット、数値、または演算子で構成される.
  • 一元オペレータと二元オペレータは、実はメソッド呼び出し
  • である.
  • オペレータの優先度は最初の文字に依存し、結合性は最後の文字
  • に依存する.
  • applyメソッドおよびupdateメソッドは、expr(args)式の評価時に呼び出される.
  • 抽出器は、入力からメタグループまたは値のシーケンスを抽出する.

  • 識別子
    変数、関数、クラスなどの名前を識別子と統一する.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
    

    技術の詳細:
  • <=、>=および!=判断識別子であり、付与オペレータではない
  • =で始まるオペレータは割り当てオペレータではありません(=,===,=,=/=)
  • aが=というオペレータを書き換えた場合、このメソッドは
  • に直接呼び出される.
    優先度
    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) => ...
      ...
    }