Scalacheat

Languages

Contents

Other Cheatsheets


About

Thanks to Brendan O'Connor. このチートシートは Scala 構文 のクイックリファレンスとして作成されました。 Licensed by Brendan O'Connor under a CC-BY-SA 3.0 license.

Contributed by Kenji Ohtsuka
   
変数  
var x = 5 変数
Good val x = 5
Bad x=6
定数
var x: Double = 5 明示的な型
関数  
Good def f(x: Int) = { x*x }
Bad def f(x: Int) { x*x }
関数定義
落とし穴: = を書かないと Unit を返す手続きになり、大惨事の原因になります。
Good def f(x: Any) = println(x)
Bad def f(x) = println(x)
関数定義
シンタックスエラー: すべての引数に型指定が必要です。
type R = Double 型エイリアス
def f(x: R) vs.
def f(x: => R)
値渡し
名前渡し (遅延評価パラメータ)
(x:R) => x*x 無名関数
(1 to 5).map(_*2) vs.
(1 to 5).reduceLeft( _+_ )
無名関数: アンダースコアは位置に応じて引数が代入されます。
(1 to 5).map( x => x*x ) 無名関数: 引数を2回使用する場合は名前をつけます。
Good (1 to 5).map(2*)
Bad (1 to 5).map(*2)
無名関数: 片側が束縛された中置演算。 わかりづらいので 2*_ と書くことを推奨します。
(1 to 5).map { val x=_*2; println(x); x } 無名関数: ブロックスタイルでは最後の式の結果が戻り値になります。
(1 to 5) filter {_%2 == 0} map {_*2} 無名関数: パイプラインスタイル (括弧でも同様) 。
def compose(g:R=>R, h:R=>R) = (x:R) => g(h(x))
val f = compose({_*2}, {_-1})
無名関数: 複数のブロックを渡す場合は外側の括弧が必要です。
val zscore = (mean:R, sd:R) => (x:R) => (x-mean)/sd カリー化の明示的記法
def zscore(mean:R, sd:R) = (x:R) => (x-mean)/sd カリー化の明示的記法
def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd カリー化の糖衣構文、ただしこの場合、
val normer = zscore(7, 0.4)_ 部分関数を取得するには末尾にアンダースコアが必要です。
def mapmake[T](g:T=>T)(seq: List[T]) = seq.map(g) ジェネリック型
5.+(3); 5 + 3
(1 to 5) map (_*2)
中置記法
def sum(args: Int*) = args.reduceLeft(_+_) 可変長引数
パッケージ  
import scala.collection._ ワイルドカードでインポートします。
import scala.collection.Vector
import scala.collection.{Vector, Sequence}
個別にインポートします。
import scala.collection.{Vector => Vec28} 別名でインポートします。
import java.util.{Date => _, _} Date を除いて java.util のすべてをインポートします。
(ファイル先頭の) package pkg
package pkg { ... }
パッケージ宣言
データ構造  
(1,2,3) タプルリテラル (Tuple3)
var (x,y,z) = (1,2,3) 構造化代入: パターンマッチによるタプルの展開。
Badvar x,y,z = (1,2,3) 隠れたエラー: 各変数にタプル全体が代入されます。
var xs = List(1,2,3) リスト (イミュータブル)
xs(2) 括弧を使って添字を書きます。 (slides)
1 :: List(2,3) 先頭に要素を追加
1 to 5 ( 1 until 6
1 to 10 by 2 と同じ)
Range の糖衣構文
() (中身のない括弧) Unit 型 の唯一の値(C/Java でいう void) 。
制御構文  
if (check) happy else sad 条件分岐
if (check) happy
( if (check) happy else () と同じ)
条件分岐の省略形
while (x < 5) { println(x); x += 1} while ループ
do { println(x); x += 1} while (x < 5) do while ループ
import scala.util.control.Breaks._
breakable {
for (x <- xs) {
if (Math.random < 0.1) break
}
}
break (slides)
for (x <- xs if x%2 == 0) yield x*10
( xs.filter(_%2 == 0).map(_*10) と同じ)
for 内包表記: filter/map
for ((x,y) <- xs zip ys) yield x*y
( (xs zip ys) map { case (x,y) => x*y } と同じ)
for 内包表記: 構造化代入
for (x <- xs; y <- ys) yield x*y
( xs flatMap {x => ys map {y => x*y}} と同じ)
for 内包表記: 直積
for (x <- xs; y <- ys) {
println("%d/%d = %.1f".format(x,y, x*y))
}
for 内包表記: 命令型の記述
sprintf-style
for (i <- 1 to 5) {
println(i)
}
for 内包表記: 上限を含んだ走査
for (i <- 1 until 5) {
println(i)
}
for 内包表記: 上限を除いた走査
パターンマッチング  
Good (xs zip ys) map { case (x,y) => x*y }
Bad (xs zip ys) map( (x,y) => x*y )
case をパターンマッチのために関数の引数で使っています。
Bad
val v42 = 42
Some(3) match {
case Some(v42) => println("42")
case _ => println("Not 42")
}
“v42” は任意の Int の値とマッチする変数名として解釈され、 “42” が表示されます。
Good
val v42 = 42
Some(3) match {
case Some(`v42`) => println("42")
case _ => println("Not 42")
}
バッククオートで囲んだ “`v42`” は既に存在する v42 として解釈され、 “Not 42” が表示されます。
Good
val UppercaseVal = 42
Some(3) match {
case Some(UppercaseVal) => println("42")
case _ => println("Not 42")
}
大文字から始まる UppercaseVal は既に存在する定数として解釈され、新しい変数としては扱われません。 これにより UppercaseVal3 とは異なる値と判断され、 “Not 42” が表示されます。
オブジェクト指向  
class C(x: R)
( class C(private val x: R)
var c = new C(4) と同じ)
コンストラクタの引数 - private
class C(val x: R)
var c = new C(4)
c.x
コンストラクタの引数 - public
class C(var x: R) {
assert(x > 0, "positive please")
var y = x
val readonly = 5
private var secret = 1
def this = this(42)
}

コンストラクタはクラスの body 部分 です。
public メンバ の宣言
読取可能・書込不可なメンバの宣言
private メンバ の宣言
代替コンストラクタ
new{ ... } 無名クラス
abstract class D { ... } 抽象クラスの定義 (生成不可)
class C extends D { ... } 継承クラスの定義
class D(var x: R)
class C(x: R) extends D(x)
継承とコンストラクタのパラメータ (要望: 自動的にパラメータを引き継げるようになってほしい)
object O extends D { ... } シングルトンオブジェクトの定義 (モジュールに似ている)
trait T { ... }
class C extends T { ... }
class C extends D with T { ... }
トレイト
実装を持ったインターフェースで、コンストラクタのパラメータを持つことができません。 mixin-able.
trait T1; trait T2
class C extends T1 with T2
class C extends D with T1 with T2
複数のトレイトを組み合わせられます。
class C extends D { override def f = ...} メソッドの override は明示する必要があります。
new java.io.File("f") オブジェクトの生成
Bad new List[Int]
Good List(1,2,3)
型のエラー: 抽象型のオブジェクトは生成できません。
代わりに、習慣として、型を隠蔽するファクトリを使います。
classOf[String] クラスの情報取得
x.isInstanceOf[String] 型のチェック (実行時)
x.asInstanceOf[String] 型のキャスト (実行時)
x: String 型帰属 (コンパイル時)