RSS

Scala Plugin For Eclipse

とりあえずある程度書けるようになったらIDEが欲しくなってしまうのがプログラマのサガですよね。

Javaで現状一番経験があるIDEはEclipseなので、
Eclipseベースのscala開発環境もあるだろう。。。。と見てみたところ、普通にありました。

Scala IDE for Eclipse

Eclipse3.6.2 HeliosのUpdateサイトにscalaのものを設定したら普通にダウンロード&導入完了。

こんな感じにscalaメニューが追加されました。



次はscalaプロジェクトの作成ですね。
新しいプロジェクトを作成しようとすると、ScalaProjectが追加されています。



プロジェクトを作成したので、次はソースを作成します。
ClassとObjectがわけて作れる辺りが微妙に便利。
まずはテストで動かすので、Objectをmainメソッド付きで生成します。



Javaでは当たり前の話ですが、きちんとscalaでも自動補完してくれました。
うーん、やはりこれを知ってしまうとテキストうちのプログラミングには戻れないですねぇ。


とりあえず再度Hello Worldプログラムを記述。
途中でちと気になったのは、「scaladocってどんな感じ?」ということ。
習性のようにコメント入れようとしたら、argsとかのコメントは補完されませんでしたので。
とまぁ、それはそれで。



で、ここまでコードを書いたら後は「Run As」メニューから「Scala Application」を実行するだけですね。


で、実行すると無事コンソールに実行結果が表示されました。
これで基本のきは一本通りましたね~。

HelloWorld改造版(別クラス参照)でのscalaの特徴とメリットデメリット

とりあえず基本型のコードは書いたのでその中で出てくるscalaの特徴と、
メリットデメリットについてまとめます。

ただ、私がベースがJava/C#プログラマな関係上、
どーしてもその2つの言語との比較になってしまうのでご注意。

1.変数に型宣言が不要


下記のコードを見てわかるように、変数に型宣言必要ありません。
ただ、valという変数を示す宣言があるだけです。

val upper = hellos.map((s:String) => s.toUpperCase())

メリットとしては、型宣言が必要ないため、
1つの関数をより汎用的に様々なクラスで使用できること。
デメリットとしては型宣言が無い関係上その瞬間での型制約が出来ず、
変数からメソッドを呼び出す場合に問題になる可能性が大きい、あたりでしょうか。

メリット:
1つの関数をより汎用的に使用可能。
デメリット:
変数の型に制約が無いため、実行時にエラーとなる可能性があがる。

2.逐次実行時一時的な変数に代入する必要が無い

下記の2行目のように、逐次実行時に一時的な変数に代入する必要がありません。
→ 1行目のように代入(変数:s)して明確にした上で実行することも可能。
_という無名の変数を用いて表現できてしまう。


val upper = hellos.map((s:String) => s.toUpperCase())
upper.foreach(Console.println(_))


これはかなり大きいメリットがあるかと。
なにせ、一時変数がわらわら出来てしまうことがなくなり、可読性がよくなりますので。
但し、デバッグの時に微妙に大変そうだなぁ、とは思います。
リモートデバッグで無名変数ってどーやって指定するんだろ。。。。

メリット:
一時変数を削減し、コードの可読性が向上
デメリット:
デバッグが困難(?)

こんな感じかな。
とりあえず今後もコード書く→特徴まとめるのサイクルをまわしていくか。

HelloWorld改造版(別クラス参照)

今まで生半可理解だったから色々身にしみる。。。というのはさておき。
HelloWorldを改造して、下記のソースを作成しました。

■HelloWhile.scala

class HelloWhile {
  def hello(hellos: String*) =  {
    val upper = hellos.map((s:String) => s.toUpperCase())
    Console.println(upper)
    upper.foreach(Console.println(_))
  }
}


■HelloWorld.scala

object HelloWorld {
  def main(args: Array[String]) {
    val helloWhile = new HelloWhile
    helloWhile.hello("hello", "hellohello", "hellohellohello")
  }
}


そんでもって、下記のようにコンパイルして実行します。

C:\work>scalac HelloWhile.scala

C:\work>scalac -cp . HelloWorld.scala

C:\work>scala -cp . HelloWorld
ArrayBuffer(HELLO, HELLOHELLO, HELLOHELLOHELLO)
HELLO
HELLOHELLO
HELLOHELLOHELLO

C:\work>



これでHelloWorldですが、別クラスを参照するHelloWorldの完成。
Javaを知っていると大体分かるんですが、微妙に違う個所も多くあります。

まず、目につくのがクラス宣言の「class HelloWhile」と「object HelloWorld」。
classが通常のクラス定義で、objectがシングルトン定義を表します。

なので、scalaのプログラムを起動する場合はシングルトン定義の中に
mainメソッドを定義して呼び出せばそこから処理がスタートするわけですね。

後は。。。「def hello(hellos: String*)  = {...」の個所でしょうか。
さすが関数型言語なだけあって、メソッド自体もイコールでつないで定義しています。

加えて、「Console.println(upper)」→「ArrayBuffer(HELLO, HELLOHELLO, HELLOHELLOHELLO)」
となるように、単にプリントを行った際に型が出力されるのがJavaとは違う所。

他にも何か色々ありますが、ここまで。とりあえずはひたすら書いてみます。。。

HelloWorldプログラムの実行

インストールが終わったので、定番のHelloWorldプログラムを実行してみます。

・・・なんですが、実行手段は下記の通り3通りあったりします。

  1. 対話方式による実行
  2. スクリプトによる実行
  3. コンパイルしての実行
なので、3通り分書いてみます。
各実行方式の違いについてはまた別記事で。


1.対話方式による実行
scalaコマンドでインタプリタを起動します。
んでもって、下記の通りにコマンドラインに入力し、確認を行います。
背後でどうJavaのオブジェクトにマッピングされているかが出力されるのが面白い所ですね。


C:\>scala
Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) Client VM, Java 1.6.0_14).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val message = "Hello World!"
message: java.lang.String = Hello World!

scala> println(message);
Hello World!

scala>



2.スクリプトによる実行
scalaコマンドにコードが書かれた内容を渡して、実行させます。
一番簡易に実行できる方式ですね。

■HelloWorld-script.scala

val message = "Hello World!"
println(message);


■実行

C:\work>scala HelloWorld-script.scala
Hello World!


3.コンパイルしての実行
予め書いたコードをコンパイルしてclassファイルを生成して、
それを実行させます。
対話方式やスクリプトによる実行とは異なり、クラスとしての構文が必要となります。

■HelloWorld.scala

object HelloWorld {
def main(args: Array[String]) {
println("Hello World!")
   }
}


■実行

C:\work>scalac HelloWorld.scala

C:\work>dir
 C:\work のディレクトリ
2011/06/02  09:42    <DIR>          .
2011/06/02  09:42    <DIR>          ..
2011/06/02  09:42               605 HelloWorld$.class
2011/06/02  09:34                47 HelloWorld-script.scala
2011/06/02  09:42               637 HelloWorld.class
2011/06/02  09:41                91 HelloWorld.scala
               4 個のファイル               1,380 バイト
               2 個のディレクトリ  25,740,607,488 バイトの空き領域

C:\work>scala HelloWorld
Hello World!

C:\work>

Scalaのインストール

復習として、インストールからも一度書いてみます。

Scalaの動作前提は下記です。

  • Java1.5以上がインストールされていること
ScalaはJVM上で動作するのである意味当たり前ではありますが。

てなわけで、一応Javaがインストールされていることを確認。




















OK。
なので、Scalaのインストールに入ります。
ScalaのHPから、Windows用のアーカイブをダウンロードします。

適当な場所に展開して、scala~\binのディレクトリにパスを通します。
んでもってScalaのパス開通確認。




















こちらもOK。

画像ばかりで記事が長くなりそうなので一端切ります。

Scalaを導入(?)しました

てなわけで(?)、題名の通り、Scalaを導入しました。

今まで技術要素としてAndroidについて色々投稿していたんですが、
単なるJavaとの違いを出すためにはどうしても
Android固有の技術要素について書かざるをえなかったんですよね。
AndroidでデザインパターンをやってもJavaでしかないわけですし。

ただ、それって検索すれば大抵見つかるもの。

んでもって、どちらかと言うと技術要素の個々を書くよりは
汎用的なプログラミングについて書いてみたかったのもありますので。

というわけで(?)、Scalaの導入から、書き方、環境についても色々書いてみることにしました。
Androidアプリを弄るのは続いているので、時々出てくるかもしれませんが、それはそれで。

デザイン変更

とりあえず、デザインを変更。
Bloggerのテンプレートサイトを漁って集積場というか、埋め立て地っぽいのを持ってきました。

色々カスタマイズ出来ることもよーやっとわかりました。
余計な上部の表示も削除して、表示領域も拡張。
うし、では続いて何か書くか。