@@ -16,71 +16,71 @@ language: ja
16
16
| <span class =" label success " >Good</span > ` val x = 5 ` <br > <span class =" label important " >Bad</span > ` x=6 ` | 定数 |
17
17
| ` var x: Double = 5 ` | 明示的な型 |
18
18
| <span id =" functions " class =" h2 " >関数</span > | |
19
- | <span class =" label success " >Good</span > ` def f(x: Int) = { x*x } ` <br > <span class =" label important " >Bad</span > ` def f(x: Int) { x*x } ` | 関数定義<br > 隠れたエラー : = を書かないと Unit を返す処理になります。; 大惨事の原因になります。 |
19
+ | <span class =" label success " >Good</span > ` def f(x: Int) = { x*x } ` <br > <span class =" label important " >Bad</span > ` def f(x: Int) { x*x } ` | 関数定義<br > 落とし穴 : = を書かないと Unit を返す手続きになり、 大惨事の原因になります。 |
20
20
| <span class =" label success " >Good</span > ` def f(x: Any) = println(x) ` <br > <span class =" label important " >Bad</span > ` def f(x) = println(x) ` | 関数定義 <br > シンタックスエラー: すべての引数に型指定が必要です。 |
21
21
| ` type R = Double ` | 型エイリアス |
22
- | ` def f(x: R) ` vs.<br > ` def f(x: => R) ` | 値による呼び出し <br > 名前による呼び出し (遅延評価パラメータ) |
22
+ | ` def f(x: R) ` vs.<br > ` def f(x: => R) ` | 値渡し <br > 名前渡し (遅延評価パラメータ) |
23
23
| ` (x:R) => x*x ` | 無名関数 |
24
24
| ` (1 to 5).map(_*2) ` vs.<br > ` (1 to 5).reduceLeft( _+_ ) ` | 無名関数: アンダースコアは位置に応じて引数が代入されます。 |
25
25
| ` (1 to 5).map( x => x*x ) ` | 無名関数: 引数を2回使用する場合は名前をつけます。 |
26
- | <span class =" label success " >Good</span > ` (1 to 5).map(2*) ` <br > <span class =" label important " >Bad</span > ` (1 to 5).map(*2) ` | 無名関数: 演算子の右側を省略する方法。 わかりやすく書きたいなら ` 2*_ ` と書くのがよいでしょう 。 |
26
+ | <span class =" label success " >Good</span > ` (1 to 5).map(2*) ` <br > <span class =" label important " >Bad</span > ` (1 to 5).map(*2) ` | 無名関数: 片側が束縛された中置演算。 わかりづらいので ` 2*_ ` と書くことを推奨します 。 |
27
27
| ` (1 to 5).map { val x=_*2; println(x); x } ` | 無名関数: ブロックスタイルでは最後の式の結果が戻り値になります。 |
28
28
| ` (1 to 5) filter {_%2 == 0} map {_*2} ` | 無名関数: パイプラインスタイル (括弧でも同様) 。 |
29
29
| ` def compose(g:R=>R, h:R=>R) = (x:R) => g(h(x)) ` <br > ` val f = compose({_*2}, {_-1}) ` | 無名関数: 複数のブロックを渡す場合は外側の括弧が必要です。 |
30
30
| ` val zscore = (mean:R, sd:R) => (x:R) => (x-mean)/sd ` | カリー化の明示的記法 |
31
31
| ` def zscore(mean:R, sd:R) = (x:R) => (x-mean)/sd ` | カリー化の明示的記法 |
32
- | ` def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd ` | カリー化の簡易記法、ただし |
33
- | ` val normer = zscore(7, 0.4)_ ` | 簡易記法を使用する場合、 部分関数を取得するには末尾にアンダースコアが必要です。 |
32
+ | ` def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd ` | カリー化の糖衣構文、ただしこの場合、 |
33
+ | ` val normer = zscore(7, 0.4)_ ` | 部分関数を取得するには末尾にアンダースコアが必要です。 |
34
34
| ` def mapmake[T](g:T=>T)(seq: List[T]) = seq.map(g) ` | ジェネリック型 |
35
35
| ` 5.+(3); 5 + 3 ` <br > ` (1 to 5) map (_*2) ` | 中置記法 |
36
36
| ` def sum(args: Int*) = args.reduceLeft(_+_) ` | 可変長引数 |
37
37
| <span id =" packages " class =" h2 " >パッケージ</span > | |
38
38
| ` import scala.collection._ ` | ワイルドカードでインポートします。 |
39
- | ` import scala.collection.Vector ` <br > ` import scala.collection.{Vector, Sequence} ` | 選択してインポートします 。 |
39
+ | ` import scala.collection.Vector ` <br > ` import scala.collection.{Vector, Sequence} ` | 個別にインポートします 。 |
40
40
| ` import scala.collection.{Vector => Vec28} ` | 別名でインポートします。 |
41
41
| ` import java.util.{Date => _, _} ` | Date を除いて java.util のすべてをインポートします。 |
42
- | ` package pkg ` _ at start of file _ <br > ` package pkg { ... } ` | パッケージ宣言 |
42
+ | _ (ファイル先頭の) _ ` package pkg ` <br > ` package pkg { ... } ` | パッケージ宣言 |
43
43
| <span id =" data_structures " class =" h2 " >データ構造</span > | |
44
44
| ` (1,2,3) ` | タプルリテラル (` Tuple3 ` ) |
45
- | ` var (x,y,z) = (1,2,3) ` | 構造化代入: タプルはパターンマッチにより展開して代入されます。 |
46
- | <span class =" label important " >Bad</span >` var x,y,z = (1,2,3) ` | 隠れたエラー: 各変数にタプル全体が代入されます。 |
45
+ | ` var (x,y,z) = (1,2,3) ` | 構造化代入: パターンマッチによるタプルの展開。 |
46
+ | <span class =" label important " >Bad</span >` var x,y,z = (1,2,3) ` | 隠れたエラー: 各変数にタプル全体が代入されます。 |
47
47
| ` var xs = List(1,2,3) ` | リスト (イミュータブル) |
48
48
| ` xs(2) ` | 括弧を使って添字を書きます。 ([ slides] ( http://www.slideshare.net/Odersky/fosdem-2009-1013261/27 ) ) |
49
49
| ` 1 :: List(2,3) ` | 先頭に要素を追加 |
50
- | ` 1 to 5 ` _ 次と同じ _ ` 1 until 6 ` <br > ` 1 to 10 by 2 ` | Range の簡易記法 |
51
- | ` () ` _ (中身のない括弧)_ | Unit 型 の唯一のメンバ (C/Java でいう void) 。 |
52
- | <span id =" control_constructs " class =" h2 " >制御構造 </span > | |
50
+ | ` 1 to 5 ` _ ( _ ` 1 until 6 ` <br > ` 1 to 10 by 2 ` _ と同じ) _ | Range の糖衣構文 |
51
+ | ` () ` _ (中身のない括弧)_ | Unit 型 の唯一の値 (C/Java でいう void) 。 |
52
+ | <span id =" control_constructs " class =" h2 " >制御構文 </span > | |
53
53
| ` if (check) happy else sad ` | 条件分岐 |
54
- | ` if (check) happy ` _ 次と同じ _ <br > ` if (check) happy else () ` | 条件分岐の省略形 |
54
+ | ` if (check) happy ` <br > _ ( _ ` if (check) happy else () ` _ と同じ) _ | 条件分岐の省略形 |
55
55
| ` while (x < 5) { println(x); x += 1} ` | while ループ |
56
56
| ` do { println(x); x += 1} while (x < 5) ` | do while ループ |
57
57
| ` import scala.util.control.Breaks._ ` <br >` breakable { ` <br >` for (x <- xs) { ` <br >` if (Math.random < 0.1) break ` <br >` } ` <br >` } ` | break ([ slides] ( http://www.slideshare.net/Odersky/fosdem-2009-1013261/21 ) ) |
58
- | ` for (x <- xs if x%2 == 0) yield x*10 ` _ 次と同じ _ <br >` xs.filter(_%2 == 0).map(_*10) ` | for 内包表記: filter/map |
59
- | ` for ((x,y) <- xs zip ys) yield x*y ` _ 次と同じ _ <br >` (xs zip ys) map { case (x,y) => x*y } ` | for 内包表記: 構造化代入 |
60
- | ` for (x <- xs; y <- ys) yield x*y ` _ 次と同じ _ <br >` xs flatMap {x => ys map {y => x*y}} ` | for 内包表記: 直積 |
58
+ | ` for (x <- xs if x%2 == 0) yield x*10 ` <br >_ ( _ ` xs.filter(_%2 == 0).map(_*10) ` _ と同じ) _ | for 内包表記: filter/map |
59
+ | ` for ((x,y) <- xs zip ys) yield x*y ` <br >_ ( _ ` (xs zip ys) map { case (x,y) => x*y } ` _ と同じ) _ | for 内包表記: 構造化代入 |
60
+ | ` for (x <- xs; y <- ys) yield x*y ` <br >_ ( _ ` xs flatMap {x => ys map {y => x*y}} ` _ と同じ) _ | for 内包表記: 直積 |
61
61
| ` for (x <- xs; y <- ys) { ` <br > ` println("%d/%d = %.1f".format(x,y, x*y)) ` <br >` } ` | for 内包表記: 命令型の記述<br >[ sprintf-style] ( http://java.sun.com/javase/6/docs/api/java/util/Formatter.html#syntax ) |
62
- | ` for (i <- 1 to 5) { ` <br > ` println(i) ` <br >` } ` | for 内包表記: 上限を含んだイテレート |
63
- | ` for (i <- 1 until 5) { ` <br > ` println(i) ` <br >` } ` | for 内包表記: 上限を除いたイテレート |
62
+ | ` for (i <- 1 to 5) { ` <br > ` println(i) ` <br >` } ` | for 内包表記: 上限を含んだ走査 |
63
+ | ` for (i <- 1 until 5) { ` <br > ` println(i) ` <br >` } ` | for 内包表記: 上限を除いた走査 |
64
64
| <span id =" pattern_matching " class =" h2 " >パターンマッチング</span > | |
65
65
| <span class =" label success " >Good</span > ` (xs zip ys) map { case (x,y) => x*y } ` <br > <span class =" label important " >Bad</span > ` (xs zip ys) map( (x,y) => x*y ) ` | case をパターンマッチのために関数の引数で使っています。 |
66
66
| <span class =" label important " >Bad</span ><br >` val v42 = 42 ` <br >` Some(3) match { ` <br >` case Some(v42) => println("42") ` <br >` case _ => println("Not 42") ` <br >` } ` | "v42" は任意の Int の値とマッチする変数名として解釈され、 "42" が表示されます。 |
67
67
| <span class =" label success " >Good</span ><br >` val v42 = 42 ` <br >` Some(3) match { ` <br >`` case Some(`v42`) => println("42") `` <br >` case _ => println("Not 42") ` <br >` } ` | バッククオートで囲んだ "\` v42\` " は既に存在する ` v42 ` として解釈され、 "Not 42" が表示されます。 |
68
68
| <span class =" label success " >Good</span ><br >` val UppercaseVal = 42 ` <br >` Some(3) match { ` <br >` case Some(UppercaseVal) => println("42") ` <br >` case _ => println("Not 42") ` <br >` } ` | 大文字から始まる ` UppercaseVal ` は既に存在する定数として解釈され、新しい変数としては扱われません。 これにより ` UppercaseVal ` は ` 3 ` とは異なる値と判断され、 "Not 42" が表示されます。 |
69
69
| <span id =" object_orientation " class =" h2 " >オブジェクト指向</span > | |
70
- | ` class C(x: R) ` _ 次と同じ _ <br >` class C(private val x: R) ` <br >` var c = new C(4) ` | コンストラクタの引数 - private |
70
+ | ` class C(x: R) ` <br >_ ( _ ` class C(private val x: R) ` <br >` var c = new C(4) ` _ と同じ) _ | コンストラクタの引数 - private |
71
71
| ` class C(val x: R) ` <br >` var c = new C(4) ` <br >` c.x ` | コンストラクタの引数 - public |
72
72
| ` class C(var x: R) { ` <br >` assert(x > 0, "positive please") ` <br >` var y = x ` <br >` val readonly = 5 ` <br >` private var secret = 1 ` <br >` def this = this(42) ` <br >` } ` | <br >コンストラクタはクラスの body 部分 です。<br >public メンバ の宣言<br >読取可能・書込不可なメンバの宣言<br >private メンバ の宣言<br >代替コンストラクタ |
73
73
| ` new{ ... } ` | 無名クラス |
74
74
| ` abstract class D { ... } ` | 抽象クラスの定義 (生成不可) |
75
75
| ` class C extends D { ... } ` | 継承クラスの定義 |
76
76
| ` class D(var x: R) ` <br >` class C(x: R) extends D(x) ` | 継承とコンストラクタのパラメータ (要望: 自動的にパラメータを引き継げるようになってほしい)
77
- | ` object O extends D { ... } ` | シングルトンオブジェクトの定義 (モジュールライク ) |
77
+ | ` object O extends D { ... } ` | シングルトンオブジェクトの定義 (モジュールに似ている ) |
78
78
| ` trait T { ... } ` <br >` class C extends T { ... } ` <br >` class C extends D with T { ... } ` | トレイト<br >実装を持ったインターフェースで、コンストラクタのパラメータを持つことができません。 [ mixin-able] ({{ site.baseurl }}/tutorials/tour/mixin-class-composition.html).
79
79
| ` trait T1; trait T2 ` <br >` class C extends T1 with T2 ` <br >` class C extends D with T1 with T2 ` | 複数のトレイトを組み合わせられます。 |
80
- | ` class C extends D { override def f = ...} ` | override をつけてオーバライドします。 |
81
- | ` new java.io.File("f") ` | オブジェクトの作成 |
82
- | <span class =" label important " >Bad</span > ` new List[Int] ` <br > <span class =" label success " >Good</span > ` List(1,2,3) ` | 型のエラー: 抽象型のオブジェクトは生成できません。<br >習慣的に型を書かない方法をとります 。 |
80
+ | ` class C extends D { override def f = ...} ` | メソッドの override は明示する必要があります。 |
81
+ | ` new java.io.File("f") ` | オブジェクトの生成 |
82
+ | <span class =" label important " >Bad</span > ` new List[Int] ` <br > <span class =" label success " >Good</span > ` List(1,2,3) ` | 型のエラー: 抽象型のオブジェクトは生成できません。<br >代わりに、習慣として、型を隠蔽するファクトリを使います 。 |
83
83
| ` classOf[String] ` | クラスの情報取得 |
84
84
| ` x.isInstanceOf[String] ` | 型のチェック (実行時) |
85
85
| ` x.asInstanceOf[String] ` | 型のキャスト (実行時) |
86
- | ` x: String ` | 型帰属 (コンパイル時) |
86
+ | ` x: String ` | 型帰属 (コンパイル時) |
0 commit comments