Scala-basic-syntax

提供:Dev Guides
移動先:案内検索

Scala-基本的な構文

Javaについて十分に理解していれば、Scalaを簡単に学ぶことができます。 ScalaとJavaの構文上の最大の違いは、「;」行末文字はオプションです。

Scalaプログラムを考えると、お互いのメソッドを呼び出して通信するオブジェクトのコレクションとして定義できます。 ここで、クラス、オブジェクト、メソッド、およびインスタンス変数の意味を簡単に見てみましょう。

  • オブジェクト-オブジェクトには状態と動作があります。 オブジェクトはクラスのインスタンスです。 例-犬には、色、名前、品種、および行動-振る、える、食べるという状態があります。
  • クラス-クラスは、そのクラスに関連する動作/状態を説明するテンプレート/設計図として定義できます。
  • メソッド-メソッドは基本的に動作です。 クラスには多くのメソッドを含めることができます。 ロジックが書き込まれ、データが操作され、すべてのアクションが実行されるのはメソッドです。
  • フィールド-各オブジェクトには、フィールドと呼ばれるインスタンス変数の一意のセットがあります。 オブジェクトの状態は、これらのフィールドに割り当てられた値によって作成されます。
  • Closure - closure は関数であり、その戻り値はこの関数の外部で宣言された1つ以上の変数の値に依存します。
  • Traits -トレイトはメソッドとフィールドの定義をカプセル化し、それらをクラスに混ぜて再利用できます。 特性は、サポートされているメソッドのシグネチャを指定することにより、オブジェクトタイプを定義するために使用されます。

最初のScalaプログラム

Scalaプログラムは2つのモードで実行できます。1つは*インタラクティブモード*で、もう1つは*スクリプトモード*です。

インタラクティブモード

コマンドプロンプトを開き、次のコマンドを使用して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 と呼ばれます。 これは、「 scala 」コマンドを使用してJava仮想マシン(JVM)で実行されるバイトコードです。

次のコマンドを使用して、Scalaプログラムをコンパイルおよび実行します。

\> scalac HelloWorld.scala
\> scala HelloWorld

出力

Hello, World!

基本的な構文

以下は、Scalaプログラミングの基本的な構文とコーディング規則です。

  • 大文字と小文字の区別-Scalaは大文字と小文字を区別します。つまり、識別子 Hellohello はScalaでは異なる意味を持ちます。
  • クラス名-すべてのクラス名について、最初の文字は大文字でなければなりません。 複数の単語を使用してクラスの名前を形成する場合、各内側の単語の最初の文字は大文字にする必要があります。 + -クラスMyFirstScalaClass。
  • メソッド名-すべてのメソッド名は小文字で始まる必要があります。 複数の単語を使用してメソッドの名前を形成する場合、各内側の単語の最初の文字は大文字にする必要があります。 + -def myMethodName()
  • プログラムファイル名-プログラムファイルの名前はオブジェクト名と完全に一致する必要があります。 ファイルを保存するときは、オブジェクト名(Scalaでは大文字と小文字が区別されることに注意してください)を使用して保存し、名前の末尾に「 .scala 」を追加する必要があります。 (ファイル名とオブジェクト名が一致しない場合、プログラムはコンパイルされません)。 + -「HelloWorld」がオブジェクト名であると仮定します。 次に、ファイルを「HelloWorld.scala」として保存する必要があります。
  • * def main(args:Array [String])*-Scalaプログラムの処理は、すべてのScalaプログラムの必須部分であるmain()メソッドから始まります。

Scala識別子

すべてのScalaコンポーネントには名前が必要です。 オブジェクト、クラス、変数、およびメソッドに使用される名前は識別子と呼ばれます。 キーワードは識別子として使用できず、識別子は大文字と小文字が区別されます。 Scalaは4種類の識別子をサポートしています。

英数字識別子

英数字の識別子は、文字またはアンダースコアで始まり、その後にさらに文字、数字、またはアンダースコアを続けることができます。 '$'文字はScalaで予約されているキーワードであり、識別子には使用しないでください。

以下は、*法的英数字識別子*です-

age, salary, _value,  __1_value

以下は*不正な識別子*です-

$salary, 123abc, -salary

オペレーター識別子

オペレーターIDは、1つ以上のオペレーター文字で構成されます。 演算子文字は、+、:、?、〜、#などの印刷可能なASCII文字です。

以下は正当なオペレーター識別子です-

&plus; &plus;&plus; ::: <?> :>

Scalaコンパイラは、内部で演算子識別子を「マングル」して、$文字が埋め込まれた正当なJava識別子に変換します。 たとえば、識別子:→は内部的に$ colon $ minus $ greaterとして表されます。

混合識別子

混合識別子は、英数字の識別子で構成され、その後にアンダースコアと演算子識別子が続きます。

以下は、有効な混合識別子です-

unary_&plus;,  myvar_=

ここで、単項演算子メソッド名として使用すると、単項&plus;が定義されます。メソッド名として使用されるoperatorとmyvar_ =は、代入演算子(演算子のオーバーロード)を定義します。

リテラル識別子

リテラル識別子は、バックティック( `で囲まれた任意の文字列です。 . . `).

以下は正当なリテラル識別子です-

`x` `<clinit>` `yield`

Scalaキーワード

次のリストは、Scalaの予約語を示しています。 これらの予約語は、定数、変数、またはその他の識別子名として使用できません。

abstract case catch class
def do else extends
false final finally for
forSome if implicit import
lazy match new Null
object override package private
protected return sealed super
this throw trait Try
true type val Var
while with yield  
- : =
<: <% >:
# @

Scalaのコメント

Scalaは、Javaと非常によく似た単一行および複数行のコメントをサポートしています。 複数行のコメントはネストできますが、適切にネストする必要があります。 コメント内で使用可能なすべての文字は、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行に単独で表示される場合は入力する必要はありません。 一方、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

あなたは、例えば、scala.collection.immutableパッケージからTreeMapとTreeSetなど、単一のパッケージから複数のクラスまたはオブジェクトをインポートすることができます-

import scala.collection.immutable.{TreeMap, TreeSet}

ダイナミックを適用

動的呼び出しを可能にするマーカー特性。 この特性のインスタンスxは、任意のメソッド名methおよび引数リストargsのメソッド呼び出しx.meth(args)、および任意のフィールド名フィールドのフィールドアクセス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)