December 21, 2009

Enjoy Scala! #3 : 配列を扱う

こんばんは!
正月が待ち遠しい jugyo です!
みなさんは何歳くらいまでお年玉をもらっていましたか?

さて、Enjoy Scala! の第3回目です。
今日は Scala で配列を扱ってみたいと思います。

ではさっそくコードを見てみましょう。

// Array を new
val strings = new Array[String](4)
// 配列に値をセット
strings(0) = "A"
strings(1) = "B"
strings(2) = "C"
strings(3) = "D"
// 出力
strings.foreach(i => println(i))

この例では、長さが 4 の配列を定義しています。
strings(3) = "D"」のように「()」を使って配列に値をセットしていますね。
こう書いたとき、コンパイラが「strings.update(3, "D")」というふうに update メソッドを呼び出すかたちに変換してくれるらしいです。

次に、配列の 0 〜 2 番目までを出力したいとしましょう。
そういう場合は以下のようにします。

for (i <- 0 to 2)
  println(strings(i))

ちなみに、上記の「0 to 2」という部分は実際には「(0).to(2)」というメソッド呼び出しに変換されるらしいです。
なので、以下のように書きかえることもできます。

for (i <- 0.to(2))
  println(strings(i))

さらに、 foreach メソッドを使って以下のように書きかえることもできます。

0.to(2).foreach(i => println(strings(i)))

で、さっきの「0 to 2」が「(0).to(2)」となる件ですけど、 Scala ではメソッド呼び出しの際、レシーバが明示的に指定されていると「.」と「()」を省略できるらしいです。
なので例えば、「(1).+(1)」というメソッド呼び出しを「1 + 1」というふうに書けるんです!

面白いですね!

初めての Scala #2 : foreach と for

こんばんは!
クリスマスが待ち遠しい jugyo です!
ずいぶん寒くなってきましたね!

さて、今日は Scala の foreachfor についてのお話です。

foeach と for と

scala コマンドでスクリプトを起動した際、 args という変数にプログラムの引数が入ってきます。
配列の foreach メソッドを使って引数のリストを出力してみます。

args.foreach(arg => println(arg))

上記の例では foreach メソッドに arg => println(arg) という関数を渡しています。
arg => println(arg) というのが Scala における関数リテラルみたいです。
引数を一個しかとらない関数リテラルの場合は引数を省略できるらしく、上記の例だと以下のように書くこともできます。

args.foreach(println)

関数リテラルで明示的に型を指定することもできて、その場合は以下のようになります。

args.foreach((arg :String) => println(arg))

Scala では型は基本的に変数等の後ろに書くみたいです。

ちなみに for 文(式?)もあって、それを使うと上記のコードを以下のように書き換えることができます。

for (arg <- args)
  println(arg)

僕は foreach のほうが好きですね。

December 19, 2009

Scala はじめました

Home

Scala にとても興味が湧いてきたので本を買って勉強を始めました。
そのうち勉強会とかやりたいです。

とりあえず今日は Scala をインストールしてインタープリターを少しだけ使ってみました。

Mac での Scala のインストール

MacPorts を使えば簡単にインストールできる。

sudo port install scala

Scala インタープリターの起動

scala とだけ入力して実行すると Scala インタープリターが起動する。
僕の環境だと以下のような感じになる。

% scala
Welcome to Scala version 2.7.5.final (Java HotSpot(TM) Client VM, Java 1.5.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 

インタープリター中で日本語を使いたい場合は -Xnojline オプションを付ける。

Hello World!

とりあえず「Hello World!」を出力してみる。

scala> println("Hello World!")
Hello World!

変数の定義

Scala には var と val の二種類の変数がある。
var は Ruby にもあるようないわゆる普通の変数。
val は Java の final に似ていて、初期化後に別の値を代入することができない。

var の場合:

scala> var foo = "foo"
foo: java.lang.String = foo

scala> foo = "FOO"
foo: java.lang.String = FOO

val の場合:

scala> val foo = "foo"
foo: java.lang.String = foo

scala> foo = "FOO"
<console>:5: error: reassignment to val
       foo = "FOO"
           ^

val に値を再代入しようとすると怒られる。

参考

今この本を読んでいます。
わかりやすくかつおもしろいです。