Scala関数式プログラミングテーマ--scala基礎文法紹介


前回は関数式プログラミングのメリットを紹介しました。そしてscalaを使って小さな例を書いて、皆さんに理解してもらいました。ここから本格的にscalaプログラミングのいくつかの内容を紹介します。
ここではまずscalaの文法を重点的に紹介します。もちろん、ここではJavaやpythonの基礎があると仮定しています。ほとんどの人はscalaを最初の学習言語として見なしません。
これらの文法の知識は覚えられなくても大丈夫です。自分の文法というものは使っているうちに覚えられます。ここにこの文章を書く目的はただ整理するだけです。文法についての初歩的な印象がありますので、後でいつでも調べられます。
PS:使っているバージョンはscala 2.1.8です。始めましょう。
一.scalaの二種類の運行方式
まず、scalaには2つの動作方式があります。それぞれはインタラクティブ環境で動作し、スクリプトで動作します。まず実行してください。scalaインストールディレクトリの下にbinフォルダがあります。このフォルダでscala.bat(Windowsシステム)をダブルクリックすれば、scalaインタラクティブ環境を起動できます。もちろん、セットアップscalaでは、システムのPath変数に「scalaディレクトリ/bin」を追加します。この時は直接cmdを実行して、scalaを入力すればいいです。
scalaもjvmプラットフォームで動作していますので、スクリプトではjavaのようにコンパイルしてから実行します。でも、私たちは普通IDEを使って処理します。個人的にはideaがもっと好きです。無料のコミュニティ版をダウンロードすれば、日常の開発ニーズを満たすことができます。
二.scala変数とタイプ
2.1変数
まず、例を使って具体的な文法を見てみます。対話式環境でハローワールドを出力します。

//       
scala> val str = "Hello world"
str: String = Hello world

//  
scala> println(str)
Hello world
この二つの行のコードは何ですか?一目で分かります。分かりません。
scalaは変数をvalとvarで宣言します。valはこの変数を意味していますが、varはこの変数を意味しています。

scala> val num = 1; //             
num: Int = 1

scala> num = 2	//     ,      ,   
<console>:12: error: reassignment to val
  num = 2
   ^

scala> var num_var = 1; //            
num_var: Int = 1

scala> num_var = 2;	//    
num_var: Int = 2
機能的には、javaのfinalのキーワードと似ています。それにscala言語はvalを多く使わせる傾向があります。
なぜですか?
合併をより便利に使うことができるので、javaの同時プログラミングの中で、一番好きなのはfinalの変数です。scalaがサポートしている関数式プログラミングは、自然と非同期と合併に適しているので、scalaの集合類を含め、デフォルトも可変ではないタイプです。可変の集合を使うには、手動で指定する必要があります。
2.2 scalaデータタイプ
変数を言い終わったら、scalaのデータの種類について説明します。ここで直接に絵を描きます。

この図はscalaのデータタイプの継承関係を説明しています。一番上のAnyタイプを見て、Anyタイプはすべてのデータタイプのお父さんです。その中でequals、toStringという方法を定義しています。javaのobjectに似ています。この点はjavaと似ています。
そして下を見ると、Anyはまた二つのタイプがあり、左のAnyValと右のAnyRefがあります。右のはともかく、それは主にあそこの知識を集めています。左側だけを見ます。
AnyValはまた複数のデータタイプに継承されています。これらは日常的に使われているいくつかのデータタイプです。Javaと似ているのはInt、Double、Longなどです。そうだ、これらのデータタイプは、Int、Double、Longなど、すべてカテゴリです。javaと違って、intとIntegerもあります。
最後に一番下のNothingとNullを見に来てください。この二つの商品を一緒に置いて言ったのはこのいくつかの概念が非常に紛らわしいからです。自分で使う時に調べなければなりません。
  • javaのnull(scalaも使うことができますが、nは小文字です):何もない、つまり空です。一般的に新しいオブジェクトを作成します。標準値はこの商品です。
  • scalaのNothing:すべてのデータタイプのサブクラスは、特定の値なしにこのタイプに対応することができます。つまり、Nothingタイプの値はできません。nullを含めてもだめです。子供がいるかもしれませんが、これを使って何をしますか?一般的には、try catchの戻り値はこのタイプです。また、プログラムexitの場合もそれに戻ります。戻り値が必要ない時は、この意味に戻ります。
  • scalaのNull(大きさに注意して書きます):すべての集合種類のサブクラスで、このタイプはnullだけを使って値を賦課することができて、ほとんど卵がないと言えます。このようなものがあると知っていればいいです。
  • 三.scalaは対象に向かってプログラミングする。
    はい、見間違えていません。ここではscalaを使って関数式プログラミングをしますが、scalaも同様にOOPの能力を提供しています。後ろに大きな確率があります。

    それともjavaの概念と似ていますが、名前はちょっと変わっています。対応は大体こんな感じです。
  • javaのinterface->scalaのtrit(実はtritはabstract classに似ています)
  • javaのabstract class->同じabstract class
  • です。
  • javaのクラス->scalaのクラスとobject
  • この中で、javaのインターフェースはscalaのtritに対応していますが、tritというものは、interfaceとは多くの違いがあります。たとえば変数を定義することができます。方法の内容を直接定義することができます。もちろん、コンストラクタがないとパラメータが受信できません。これは相変わらずです。
    
    trait Car {
     val brand: String
    }
    
    trait Shiny {
     val shineRefraction: Int
    }
    class BMW extends Car {
     val brand = "BMW"
    }
    //  with   ,           :
    
    class BMW extends Car with Shiny {
     val brand = "BMW"
     val shineRefraction = 12
    }
    次に、classとobjectについて話します。
    scalaでは、staticというキーワードがないので、多くのjavaの機能は、静的な方法や単一の例のモード、またはmainの方法がないと実現できません。この時、Objectは現れました。
    各クラスには同じ名前のobjectがあります。このobjectは連れと呼ばれています。classとobjectはお互いに相手のプライベートメンバー(public、prvateなどの権限を訪問するのはjavaと同じです)に訪問することができます。
    
    class Json{
     
    }
    object Json {
     def toJsonObject(str:String):Unit = {
     
     }
     var a = 1
     def main(args:Array[String]):Unit = {
     val json = Json
     json.toJsonObject("......") //   new  ,    toJsonObject  。
    
     }
    }
    objectのおかげで、java静的な方法を呼び出すようにscalaコードを書くことができます。このすべてはobjectのおかげです。
    なぜなら!objectの中の変数、あるいは方法、すべてstaticので、ここの言うstaticは便利にjava基礎の子供靴があるので、scalaはstaticのこのキーワードがないのです。単例を使うなら、もっと簡単で、直接にobjectを定義すればいいです。
    
    object Timer {
     var count = 0
    
     def currentCount(): Long = {
     count += 1
     count
     }
    }
          :
    
    scala> Timer.currentCount()
    res0: Long = 1
    次によく使う文法飴を言います。それはobjectのアプリです。一つの種類が一つの用途しかない時に使うことができます。
    
    scala> class Foo {}
    defined class Foo
    
    //   apply  
    scala> object FooMaker {
      | def apply() = new Foo
      | }
    defined module FooMaker
    
    //  object,       apply
    scala> val newFoo = FooMaker() //      Foo,     FooMaker() apply 
    newFoo: Foo = Foo@5b83f762 
    上のコードを見てください。objectはnewでなくて直接使えます。使う時は、このOBのアプリをデフォルトで呼び出しました。
    よく知っていると思いますか?これは工場モデルです。
    OKです。これらはscalaの中にあります。対象に向けた基礎知識については、もちろん高次のものもあります。集合や多状態など、後から使うときに話しましょう。
    おわりに
    今回はscalaの基礎変数とタイプを紹介しました。scalaはデフォルトでは変数の使用をより推奨しています。一般的なデータタイプとjavaはほぼ同じです。名前と使い方が違います。
    対象に向かうこのブロックの上で、基本的にjavaと同じぐらいで、javaの基礎があるのでさえすれば、この部分の文法を熟知するのは問題ではないはずです。
    では私の理解では、なぜscalaはこれらの変更があるのでしょうか?まず、scalaはjava発明後に創建されたもので、その設計理念は必ずjavaより成熟します。だから、いくつかのjavaの欠陥を解決したいです。例えば、javaのいくつかの文法は冗長です。scalaは比較的に柔軟で、たとえば多くなったobject、毎回newの1つの対象を必要としないで、更にたとえばインタラクティブな環境があります。
    次に、scalaも関数式プログラミングに近いため、関数式の核心は、副作用コードがないことを編纂するのです。もっと本質的には、コードを分割してモジュール化することです。各モジュールは各自その職責を司っています。自分のものではなく、自分で自分のことを管理しています。これはサービスの思想と同じです。
    したがって、scalaは変数を可変できないように黙認します。コードをできるだけ変更しないようにするためです。
    OKです。じゃ、今日はここまでにしましょう。今度はscala文法の重要なシーン、集合と関数について話します。
    以上はscalaの関数式がテーマを編みます――scalaの基礎文法の紹介の詳しい内容で、更にscalaの関数式のプログラミングに関しての資料は私達のその他の関連している文章に関心を持って下さい!