Scala-基本構文
Javaをよく理解していれば、Scalaを学ぶのはとても簡単です。ScalaとJavaの構文上の最大の違いは、「;」です。行末文字はオプションです。
Scalaプログラムを考えるとき、それはお互いのメソッドを呼び出すことによって通信するオブジェクトのコレクションとして定義することができます。ここで、クラス、オブジェクト、メソッド、およびインスタンス変数の意味を簡単に見てみましょう。
Object−オブジェクトには状態と動作があります。オブジェクトはクラスのインスタンスです。例-犬には、色、名前、品種、行動などの状態があります。振る、吠える、食べる。
Class −クラスは、クラスに関連する動作/状態を説明するテンプレート/ブループリントとして定義できます。
Methods−メソッドは基本的に動作です。クラスには多くのメソッドを含めることができます。これは、ロジックが書き込まれ、データが操作され、すべてのアクションが実行されるメソッド内にあります。
Fields−各オブジェクトには、フィールドと呼ばれる固有のインスタンス変数のセットがあります。オブジェクトの状態は、これらのフィールドに割り当てられた値によって作成されます。
Closure − a closure は関数であり、その戻り値は、この関数の外部で宣言された1つ以上の変数の値に依存します。
Traits−トレイトはメソッドとフィールドの定義をカプセル化し、それらをクラスに混合することで再利用できます。トレイトは、サポートされているメソッドのシグネチャを指定することにより、オブジェクトタイプを定義するために使用されます。
最初のScalaプログラム
Scalaプログラムは2つのモードで実行できます。1つは interactive mode そしてもう一つは script mode。
インタラクティブモード
コマンドプロンプトを開き、次のコマンドを使用してScalaを開きます。
\>scala
Scalaがシステムにインストールされている場合、次の出力が表示されます-
Welcome to Scala version 2.9.0.1
Type in expressions to have them evaluated.
Type :help for more information.
Scalaプロンプトの右側に次のテキストを入力し、Enterキーを押します-
scala> println("Hello, Scala!");
次の結果が得られます-
Hello, Scala!
スクリプトモード
スクリプトモードでScalaプログラムを作成するには、次の手順を使用します。メモ帳を開き、次のコードを追加します。
例
object HelloWorld {
/* This is my first java program.
* This will print 'Hello World' as the output
*/
def main(args: Array[String]) {
println("Hello, world!") // prints Hello World
}
}
ファイルを-として保存します HelloWorld.scala。
コマンドプロンプトウィンドウを開き、プログラムファイルが保存されているディレクトリに移動します。'scalac'コマンドはScalaプログラムをコンパイルするために使用され、現在のディレクトリにいくつかのクラスファイルを生成します。それらの1つが呼び出されますHelloWorld.class。これは、 'を使用してJava仮想マシン(JVM)で実行されるバイトコードです。scala'コマンド。
次のコマンドを使用して、Scalaプログラムをコンパイルして実行します。
\> scalac HelloWorld.scala
\> scala HelloWorld
出力
Hello, World!
基本構文
以下は、Scalaプログラミングの基本的な構文とコーディング規約です。
Case Sensitivity − Scalaでは大文字と小文字が区別されます。つまり、識別子です。 Hello そして hello Scalaでは異なる意味を持ちます。
Class Names−すべてのクラス名で、最初の文字は大文字にする必要があります。クラスの名前を形成するために複数の単語が使用されている場合、各内側の単語の最初の文字は大文字である必要があります。
Example −クラスMyFirstScalaClass。
Method Names−すべてのメソッド名は小文字で始める必要があります。メソッドの名前を形成するために複数の単語が使用されている場合、各内側の単語の最初の文字は大文字である必要があります。
Example − def myMethodName()
Program File Name−プログラムファイルの名前は、オブジェクト名と完全に一致している必要があります。ファイルを保存するときは、オブジェクト名を使用して保存し(Scalaでは大文字と小文字が区別されることに注意してください)、 'を追加する必要があります。.scala'名前の最後まで。(ファイル名とオブジェクト名が一致しない場合、プログラムはコンパイルされません)。
Example−「HelloWorld」がオブジェクト名であると想定します。次に、ファイルを「HelloWorld.scala」として保存する必要があります。
def main(args: Array[String]) − Scalaプログラムの処理は、すべてのScalaプログラムの必須部分であるmain()メソッドから開始されます。
Scala識別子
すべてのScalaコンポーネントには名前が必要です。オブジェクト、クラス、変数、およびメソッドに使用される名前は、識別子と呼ばれます。キーワードを識別子として使用することはできず、識別子では大文字と小文字が区別されます。Scalaは4種類の識別子をサポートしています。
英数字識別子
英数字の識別子は、文字またはアンダースコアで始まり、その後にさらに文字、数字、またはアンダースコアを続けることができます。'$'文字はScalaで予約されているキーワードであり、識別子には使用しないでください。
以下は legal alphanumeric identifiers −
age, salary, _value, __1_value
以下は illegal identifiers −
$salary, 123abc, -salary
演算子識別子
オペレーターIDは、1つ以上のオペレーター文字で構成されます。演算子文字は、+、:、?、〜、#などの印刷可能なASCII文字です。
以下は正当なオペレーター識別子です-
+ ++ ::: <?> :>
Scalaコンパイラーは、オペレーターIDを内部的に「マングル」して、$文字が埋め込まれた正当なJavaIDに変換します。たとえば、識別子:->は、内部的に$ Colon $ minus $ greaterとして表されます。
混合識別子
混合IDは、英数字IDで構成され、その後にアンダースコアとオペレーターIDが続きます。
以下は合法的な混合識別子です-
unary_+, myvar_=
ここで、メソッド名として使用されるunary_ +は単項+演算子を定義し、メソッド名として使用されるmyvar_ =は代入演算子(演算子のオーバーロード)を定義します。
リテラル識別子
リテラル識別子は、バックティック( `..。`)で囲まれた任意の文字列です。
以下は、有効なリテラル識別子です-
`x` `<clinit>` `yield`
Scalaキーワード
次のリストは、Scalaで予約されている単語を示しています。これらの予約語は、定数や変数、またはその他の識別子名として使用することはできません。
概要 | 場合 | キャッチ | クラス |
def | 行う | そうしないと | 拡張します |
false | 最後の | 最終的に | にとって |
いくつかのための | もし | 暗黙 | インポート |
怠惰 | 一致 | 新着 | ヌル |
オブジェクト | オーバーライド | パッケージ | 民間 |
保護 | 戻る | 封印 | 素晴らしい |
この | スロー | 特性 | 試してみてください |
true | タイプ | val | Var |
一方 | と | 産出 | |
- | : | = | => |
<- | <: | <% | >: |
# | @ |
Scalaのコメント
Scalaは、Javaと非常によく似た1行コメントと複数行コメントをサポートしています。複数行コメントはネストできますが、適切にネストする必要があります。コメント内で使用可能なすべての文字は、Scalaコンパイラーによって無視されます。
object HelloWorld {
/* This is my first java program.
* This will print 'Hello World' as the output
* This is an example of multi-line comments.
*/
def main(args: Array[String]) {
// Prints Hello World
// This is also an example of single line comment.
println("Hello, world!")
}
}
空白行と空白
おそらくコメント付きの空白のみを含む行は空白行と呼ばれ、Scalaはそれを完全に無視します。トークンは、空白文字やコメントで区切ることができます。
改行文字
Scalaは行指向の言語であり、ステートメントはセミコロン(;)または改行で終了する場合があります。通常、ステートメントの最後にあるセミコロンはオプションです。必要に応じて入力できますが、ステートメントが1行に単独で表示される場合は入力する必要はありません。一方、1行に複数のステートメントを記述する場合は、セミコロンが必要です。以下の構文は、複数のステートメントの使用法です。
val s = "hello"; println(s)
Scalaパッケージ
パッケージは、名前付きのコードモジュールです。たとえば、Liftユーティリティパッケージはnet.liftweb.utilです。パッケージ宣言は、次のようにソースファイルの最初の非コメント行です。
package com.liftcode.stuff
Scalaパッケージは、現在のコンパイルスコープで参照できるようにインポートできます。次のステートメントは、scala.xmlパッケージの内容をインポートします-
import scala.xml._
単一のクラスとオブジェクト、たとえば、scala.collection.mutableパッケージからHashMapをインポートできます-
import scala.collection.mutable.HashMap
1つのパッケージから複数のクラスまたはオブジェクトをインポートできます。たとえば、scala.collection.immutableパッケージのTreeMapとTreeSet-
import scala.collection.immutable.{TreeMap, TreeSet}
動的に適用
動的な呼び出しを可能にするマーカー特性。このトレイトのインスタンスxは、任意のメソッド名methおよび引数リストargsのメソッド呼び出しx.meth(args)と、任意のフィールドnamesfieldのフィールドアクセスx.fieldを許可します。この機能はScala-2.10で導入されました。
呼び出しがxによってネイティブにサポートされていない場合(つまり、型チェックが失敗した場合)、次のルールに従って書き換えられます。
foo.method("blah") ~~> foo.applyDynamic("method")("blah")
foo.method(x = "blah") ~~> foo.applyDynamicNamed("method")(("x", "blah"))
foo.method(x = 1, 2) ~~> foo.applyDynamicNamed("method")(("x", 1), ("", 2))
foo.field ~~> foo.selectDynamic("field")
foo.varia = 10 ~~> foo.updateDynamic("varia")(10)
foo.arr(10) = 13 ~~> foo.selectDynamic("arr").update(10, 13)
foo.arr(10) ~~> foo.applyDynamic("arr")(10)