SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新開発言語「Scala」の実体

Javaの限界を超えて実用化を目指す
新開発言語「Scala」のメリットとは~前編

キーワードは手軽さと拡張性

制御構文

if文
if(条件式){ブロック(1) } else{ ブロック(2) }

 条件式は、Boolean(真偽値)で表わされる式です。条件式が「true(真)」の処理内容をブロック(1)に、「false(偽)」の処理内容をブロック(2)に記述します。JavaやC/C++と異なり、Scalaのif文は値を返します。これは、前述のように中括弧で区切られたブロックが値を返すためです。次で試してみましょう。

scala> val flag = true
flag: Boolean = true
scala> if (flag) 1 else -1
res2: Int = 1

 ブロック(1)とブロック(2)の部分の戻り値が同一に揃えられている場合(ここではInt)、if文全体の戻り値もその型となります(ここではInt)。

scala> if (flag) 1 else "something"
res3: Any = 1

 ブロック(1)とブロック(2)の部分の戻り値が異なる場合、if文全体の戻り値はそれらの上位型となります(ここではAny)。また、if else式は次の構文のようにつなげることもできます(LIST8)。

if(条件式){
        ブロック(1)
}else if(条件式){
        ブロック(2)
}else{
        ブロック(3)
}}
LIST8
scala> val test = 1
test: Int = 1

scala> var ret = 0
ret: Int = 0

scala> ret = if(test == 1){
     | 	1		//Int型
     | }else if(test == 2){
     | 	2		//Int型
     | }else{
     | 	3		//Int型
     | }
ret: Int = 1	//戻り値を受け取っている事を確認出来る

scala> val ret = if(test == 1){50}	//ret = 50 となって欲しいのだが・・・
ret: Unit = ()		//実際にはUnit型となる

 なお、elseのないif文は強制的に戻り値がUnit型となります。

while

 Scalaのwhile文は、他の言語のwhileと同等と言って良いでしょう。ここでは省略しますが、dowhile文も使用できます。

while(条件式){
      処理
}
for

 Scalaのforは、Java SE 5の拡張forループのような表記がデフォルトです。

for(i <- 開始値 to 終了値) {ブロック}
for(i <- 開始値 to 終了値 ; 条件式1; 条件式2; ……)

 見慣れないかもしれませんが、i=1, 2, 3...と連続的に増加していく点は同一です(LIST9)。

LIST9:オーソドックスなループ
scala> for(i <- 1 to 3){ println(i) }
1
2
3

scala> for(i <- 1 to 5; if(i>1); if(i<3)){ println(i) }
2
yieldキーワードを用いたコレクションを返すループ

 ここまでのforループは、制御構造を表わすJavaやC/C++などと同等のものですが、yieldキーワードを用いると、各ループごとの処理結果を返すことができます。図1のようにループの各要素を2倍していく単純な例を記述してみましょう(LIST10)。

図1:for yield式
図1:for yield式
LIST10
scala> val test = for(i <- 1 to 3) yield{ i * 2}
test: RandomAccessSeq.Projection[Int] = RangeM(2, 4, 6)

 ループ内のブロック{ i * 2}による処理結果の全体がyieldを介して、変数testに投影(projection)されています。変数testは、Int型の値を持ちます。testの各要素にはカッコ内0からはじまる順序を書いてアクセスできます(LIST11)。testはいわゆるコレクション(集合)となります。Scalaでのコレクションの扱いについては次ページで解説します。

LIST11
scala> test(0)
res1: Int = 2

scala> test(1)
res3: Int = 4

次のページ
Scalaでの集合の扱い

この記事は参考になりましたか?

新開発言語「Scala」の実体連載記事一覧

もっと読む

この記事の著者

株式会社パテントビューロ 三木隆史(ミキ タカフミ)

株式会社パテントビューロ所属。マネージャー業務と平行して、Webアプリケーション開発、自然言語系の研究開発を行なう。以前はC言語による組込開発。違和感なくScalaへ移行できたことや、ロジック部分に注力できる生産性の高さに驚いている。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

株式会社パテントビューロ 木村吉博(キムラ ヨシヒロ)

政府系研究機関での研究開発を経て、現在、株式会社パテントビューロにて、プログラミング(知財関連文書(SGML/XML)の変換バッチ処理のScalaでの記述など)を担当している。複雑でイレギュラーな記述も多々見られる大量の文書を相手にする際に、Scalaの書きやすさと高速性とに大いに助けられている。か...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4475 2009/11/06 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー