Version 54 (modified by kmizu, 6 years ago)

--

Scala Sandbox TOP

Scala-sandbox-docs

Scala-sandboxの文書ページです.

技術情報やライブラリの使い方,FAQ(Q&A)などがここに書かれます.

なお,このページとは別にScala-sandboxのトップページがあります.

技術情報

文法

  • val
    • valで定義した変数は、一度値を設定した後は更新することができません (Javaのfinalのようなものです)。あくまで、更新できないのは変数の値で であって、変数が指している先のオブジェクトを変更することは可能であることに 注意してください(この点もJavaのfinalと同じです)。
      val a :Int = 10
      a = 20 //エラー。valで定義した変数の値を更新することはできない
      
      val a = 10 // 変数の型は省略可能
      
      val b:Array[Int] = Array(1, 2, 3)
      b(0) = 2 //OK。変数が指しているオブジェクト(配列)の内容は更新できる
      
  • var
    • varで定義した変数は、値を更新することができる変数になります( (Javaの通常の変数と同じ)。
      var a :Int = 10
      a = 20 //OK。
      
      var a = 10 // 変数の型は省略可能
      
  • for
  • ブロック/クロージャ
  • class
  • object
  • case class
  • パターンマッチ
  • apply
  • unapply
  • implicit
  • 演算子を定義したい
  • 単項演算子を定義したい
    • 単項の前置演算子としてユーザが定義できるのは、+,-,!,~の4種類です。
      class P {
        def unary_+ :Int = 1 //unary_`operator_name`の形で定義
      }
      println(+new P) //1
      
      のような形でメソッドを定義および使用することができます。
    • 単項の後置演算子はScalaでは通常のメソッドと同じように定義します。

例:

def
 * setterを定義したい
 * getterを定義したい
 * 可変長引数を定義したい
   * 可変長引数を取るメソッドは以下のようにして定義することができます。最後の引数
     の型名の後に*を付けることで、その引数が可変長引数になります。メソッド内部
     での可変長引数の扱いは配列と似ていますが微妙に違うので、配列を受け取るメソッド
     などに可変長引数を渡したい場合、toArrayメソッドを使用しましょう。
{{{
def printAll(xs :Int*) {
  for(x <- xs) print(x)
  println()
}
...
printAll(1, 2, 3) // => 123
}}}
 * 可変長引数を取るメソッドに配列などのオブジェクトを展開した要素を渡したい
   * 可変長引数を取るメソッドの実引数の後ろに:_*を付けることで可能です。
{{{
def printAll(xs :Int*) {
  for(x <- xs) print(x)
  println()
}
...
printAll(Array(1, 2, 3):_*) // => 123
}}}
 * 「可変長引数を引数に取る関数」の型を記述したい
   * {{{val f :Int* => Unit = ...}}}だと構文エラーになります。
     {{{val f :(Int*) => Unit = ...}}}のように、可変長引数の型を()でくくってください。

 * 注意:可変長引数を持つ関数のオーバロードには注意が必要
   * 可変長引数は、内部的にscala.Seqに変換される。よって、例えば以下のように引数の型が違う様に見えても、内部的には同じtest(scala.Seq)になってしまうため、コンパイル出来ない。
{{{
def test(i:Int*   ) = "hoge"
def test(s:String*) = "piyo"
}}}


== FAQ(Q&A) ==

=== Javaからの移行 ===

 * Scalaの`for`文はJavaの`for`文と違うようですが
  * Scalaの`for`文はJavaの`for`文とは意味がかなり違いますが,ほぼおなじ事ができます
{{{
Java:  for(int i = 0; i < 10; i++) { ... }
Scala: for(i <- 0 until 10) { ... }

Java:  for(int i = 0; i <= 10; i++) { ... }
Scala: for(i <- 0 to 10) { ... }

Java:  for(String str : new String[] {"aaa", "bbb", "ccc"}) { ... }
Scala: for(str <- Array("aaa", "bbb", "ccc")) { ... }
}}}
 * Scalaの`while`文の中にロジックを書きたい
  * Scalaの`while`文はループの評価式しか書けませんのでブロックを使って書きます
{{{
Java:
  int len;
  while((len = in.read(b)) > 0} { ... }
Scala:
  val len: Int = 0
  while({len = in.read(b); len > 0}) { ... }
}}}
 * Javaのコレクションを使いたい
  * `scala.collection.jcl._`を使いましょう.Scalaによって機能が拡張されますしGenericsも扱う事ができます
 * メソッドをsynchronizedしたい
{{{
Java:  synchronized void foo() { ... }
Scala: def foo() = synchronized { ... }
}}}
 * オブジェクトをsynchornizedしたい
{{{
Java:  synchornized(foo) { ... }
Scala: foo.synchronized { ... }
}}}
 * Javaの`equals`相当のことをするには?
  * Anyクラスの`equals`または`==`メソッドを使いましょう。逆にJavaの`==`相当のことをしたいときは、
    `AnyRef`クラスの`eq`メソッドを使います。
=== 困った ===

 * パッケージ名に「scala」という名前があると,importできません
  * Scalaでは相対的に`import`する事ができますが,パッケージ名に「scala」という名前があるとScala本来のパッケージを`import`できなくなります.`import`するときに`_root_.`を先頭に
    付加することで回避できますが、パッケージ名に「scala」という名前を含めない方が無難
    でしょう。
{{{
import _root_.scala.collection.mutable._
}}}
 * 予約語と同じ名前のメソッド(ex. `Thread.yield`など)を呼び出しできない
  * `Thread.yield`の場合は,`yield`が予約語で登録されているため,そのままでは呼び出しできません.この場合は,{{{`名前`}}}と書きます
{{{
Thread.`yield`()
}}}
 * i1 & i2 != 0がコンパイルエラーになる
  * Javaと演算子の優先順位が違っているためです。括弧を使って(i1 & i2) != 0
    とすることでコンパイルが通るようになります。

== ソース(src)の説明 ==

== リンク ==

 1. 公式
  * [http://www.scala-lang.org/ The Scala Programming Language]: Scala本家
  * [http://lampsvn.epfl.ch/trac/scala Scala - Trac]
  * [http://dir.gmane.org/gmane.comp.lang.scala/ Scala ML(英語)のアーカイブ]
 2. ドキュメント
  * [http://www.scala-lang.org/docu/files/api/index.html API ドキュメント]
  * [http://www.scala-lang.org/docu/manuals.html 各種ドキュメント]
  * [http://www29.atwiki.jp/tmiya/pages/11.html A Scala Tutorial for Java Programmer の和訳]
  * [http://technohippy.developer.drecom.jp/blog/articles/289 Scalaアクター -- ショートチュートリアルの和訳]
 3. ライブラリ
  * [http://lamp.epfl.ch/~phaller/actors.html Scala Actors]:Actor関連
  * [http://www.artima.com/scalatest/ ScalaTest]: Scalaテストフレームワーク
  * [http://code.google.com/p/specs/ Specs]: BDDなテストフレームワーク
  * [http://liftweb.net/index.php/Main_Page/ Lift]: Webアプリケーションフレームワーク
 4. 情報源
  * [http://mixi.jp/view_community.pl?id=3111016 Scalaコミュニティ(mixi)]
  * [http://www.lingr.com/room/scala-ja Scala-ja]:日本のScalalian(仮)の寄り合い所w
  * [http://lingrbbs.com/room/scala-ja LingerBBS]
  * [http://reddit.com/r/scala/ reddit(Scala)]
 5. 紹介記事
  * [http://www.ibm.com/developerworks/jp/java/library/j-scala01228.html 多忙な Java 開発者のための Scala ガイド: オブジェクト指向のための関数型プログラミング]
  * [http://gihyo.jp/dev/serial/01/awdp/0007 気になる開発プロダクツ]
  * [http://www.thinkit.co.jp/free/article/0711/4/3/ オブジェクト指向と関数型を兼ね備えた「Scala」]
  * [http://www.infoq.com/jp/news/2008/01/why-scala なぜScalaなのか?]
  * [http://builder.japan.zdnet.com/news/story/0,3800079086,20364874,00.htm ScalaのテスティングフレームワークScalaTest 0.9]
  * [http://builder.japan.zdnet.com/news/story/0,3800079086,20366770,00.htm Scalaで書かれたWebアプリフレームワークlift Web Framework 0.5]
 6. ブログ
  * [http://cappuccino.jp/keisuken/ 航海日誌]
  * [http://www.coins.tsukuba.ac.jp/~i021216/diary/ Onion開発日記]
  * [http://inforno.net/ inforno]
  * [http://d.hatena.ne.jp/yukoba/ yukobaの日記]
  * [http://blog.goo.ne.jp/byakhee/e/0c39a40f857124440fd865b1d4c64fa9 garbage truck]
  * [http://d.hatena.ne.jp/h-hirai/ 日曜プログラマがダラダラ書く]
  * [http://blog.so-net.ne.jp/rainyday/archive/c5378301 Rainy Day Codings]
  * [http://d.hatena.ne.jp/sshi/20080216 sshi.Continual]
  * [http://recompile.net/2007/07/a_scala_tutorial_for_java_prog.html A Scala Tutorial for Java programmers を淡々と写経するよ]
  * [http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20060410 じじぃの日記、ツッコミ可]
  * [http://d.hatena.ne.jp/HHa/20070508/1178609649 ほぼりスクリプト言語Scalaの情報ソース]
  * [http://www.rubyist.net/~matz/rast-search.rb?query=scala Matzにっき(Scalaカテゴリの検索結果)]
  * [http://d.hatena.ne.jp/ryugate/ ryugateの日記]
 7. その他、サンプルコードなど
  * [http://ja.wikipedia.org/wiki/Scala Wikipedia]
  * [http://ja.doukaku.org/lang/scala/ どう書く.org]