[scala][java][tutorial] Scala本を読む 5

宿題やってる気分

6章は「関数形スタイルのオブジェクト」(の作り方)
変化する状態を持たない=イミュータブル

  • 6.2

クラス定義

class Rational(n:Int, d:Int){
  println("created.")
}

クラス定義の後ろの()内は"基本コンストラクター"
よくある、初期値を引数にとってクラス内のメンバを初期化するようなコードを簡略に書ける。
そもそもn,dはセットする必要もなく、後でクラス内で利用可能。private変数扱い

コラム:イミュータブルのメリット・デメリット

    1. ○状態変化しないので動作が推定しやすい
    2. ○オブジェクトを他のコードに渡すとき、コピーを作る必要がない
    3. ○スレッドセーフ
    4. ○ハッシュテーブルで後から変更が加えられる恐れがない
    5. ×大きなオブジェクトのコピーが必要になることがある
  • 6.3 toStringメソッドのオーバーライド
class Rational(n:Int, d:Int){
  override def toString = n + "/" + d
}

  • 6.4 事前条件のチェック
class Rational(n:Int, d:Int){
  require (d != 0)
  override def toString = n + "/" + d
}

requireメソッドは引数がfalseのときにIllegalArgumentExceptionを投げる

  • 6.5

  • 6.6 自己参照

this.

基本コンストラクター以外のコンストラクター
補助〜は、最初にそのクラスの他のコンストラクターを呼び出すことが必要。
Javaのコンストラクタではスーパークラスのコンストラクタも許可されているが、Scalaはダメ。

  • 6.8 非公開フィールドとメソッド

private。
scalaのコンストラクタ内の処理は記述順に実行される

+や*は通常のメソッド定義と同じように書ける。演算子の優先順位も*>+

  • 6.10 識別子

1. 演算子識別子
英数字とコードの記述に必要な(かっこ、ピリオド、_、カンマなど)以外の7ビットASCII文字
+ とか、++とか、:->とか。スペースを入れずにひと塊りにできる。
Javaの世界は、+は$plus、:は$colonのように変換されてメソッド名になっているので、
メソッド"+"はa.$plus(b)のように呼べる
2. ミックス識別子
英数字+アンダースコア+演算子識別子からなる
3. リテラル識別子
バッククォートで囲まれた名前。Javaの世界にあるScalaの予約後でできたメソッドにアクセスするために使う。
javaのThread.yield()が主な使いどころらしい。
Thread.`yield`()とアクセス。

  • 6.11 メソッドの多重定義

javaと同じ

  • 6.12 暗黙の型変換
implicit def intToRational(x:Int) = new Rational(x)

implicitで、コンパイラに”さまざまな状況で自動的に適用”するよう指定する。
2 * new Rational(1,2)はできなかったが、これで

val r = new Rationla(1,2)
2 * r

ができるようになる。
整数2に対してRationalクラスの*メソッドが無いためエラーになっていたが、
implicitで整数2をRationalクラスに型変換された
→把握していないとあとで勝手に型変換されそう。

[scala][java][tutorial] Scala本を読む 4

リアル3日坊主でビビった

5章 基本型と演算子

  • 5.1 基本型

基本Javaの型のラッパーっぽい。
だたしプリミティブ型に対応する型はIntとかByteとか大文字。小文字は推奨されない。

ほぼJavaと同じ。よって飛ばす。

ダブルコーテーション×3でヒアドキュメント。
stripMarginメソッドを呼び出すと行頭合わせのためのスぺースを除ける

println("""|this is a pen.
        |My name is Ken.""".stripMargin)
↓
this is a pen.
My name is Ken.

何だ?
先頭がアポストロフィーで始まる英数字の識別子のこと。

val s = 'symbol
s.name

res:0 String = symbol

すべての演算子はメソッド = どのメソッドも演算子記法を使える。

val s = "aabbccdd"
s.ndexOf('b')
res:0 Int = 2

s indexOf 'b'
res:1 Int = 2

前置、中置、後置演算子のどれもメソッド呼び出しと等価。
細かいので略。

    • 5.4以降

Javaとおなじ。たぶん。

  • -

[ruby][watir][ie][test] watir使う

rubyやらgemのインストール

社内はプロキシ認証が必要なので環境変数に以下を設定する
export http_proxy=http://host:port
export http_proxy_user=user
export http_proxy_pass=pass

scalaが本当に3日坊主に・・

Scala本を読む 3

さぁ、三日坊主だ!

  • 4.クラス

メンバーはデフォルトpublic
return 何も書かないと最後に計算された結果を返す(あとで関数型にプログラミングしやすいのかな?)
また、returnを複数書かない→メソッドが小さくなりやすい

セミコロンはオプション。
以下は2つの文(文:xと文:+y)になる

 x
 +y

こうすればx+yになる

 x +
 y
または
 (x
 +y)
  • 4.3 シングルトンオブジェクト

staticクラスのようなもの。
オブジェクトだけどnewできない。=一つしか存在しない。
Class hogehogeを
object hogehogeにすると定義完了。
あるクラスと同じ名前のシングルトンオブジェクトは、そのクラスと同じファイル中に定義しないといけない。(なぜw)
クラスと名前を共有しない場合は「スタンドアロンオブジェクト」という名前になる。

なんか色々な単語がでてきた^^

  • 4.4 Scalaアプリケーション

Scalaプログラムの実行にはmainメソッドを持つスタンドアロンシングルトンオブジェクトの名前を指定する。
クラス名とファイル名は揃っていなくてもよい(スクリプトとか書けるし)が、そろえることを推奨。

  • 4.5 Applicationトレイト

mainとか、書かなくても実行できる仕組み。
Applicationクラスをextendsすると、{}の中身が実行される。
{}の中身をApplicationクラスのmainに渡しているのかねぇ?

Scala本を読む 2

どうか3日坊主になりませんように。

  • trait・・・??
  • やじるし

"A -> B" AとBからなるタプルを返す2項演算子
mapの初期化とか。

val tmpMap = Map[Int, String]()
tmpMap += (1 -> "aaa")
tmpMap += (2 -> "bbb")

  • 3.5関数形のスタイルを見分ける

関数形で書くにはなるべくvalを使う。varは使わない。

副作用を持たないようにする。=返り値がUnitなら副作用がある(はず)
返り値がなければメソッド内で副作用を起こすしかない

メソッド内に副作用があると、テストが大変
メソッド実行結果を何らかの方法で「取得」して、検証しなければいけないから。

  • 3.6ファイルから行を読みだす

Int型のメソッドmax() … レシーバと引数のmaxを返す
reduceLeft()メソッド … listのメソッドかな?「与えられた関数を先頭2行に適用し、処理結果と次の1行を引数にして同じ関数を適用する」
 こういうのが関数型のメソッドっぽい。あまり見たことないし。

ファイルを1行ずつ読み込む

val lines= Source.fromFile(args(0)).getLines.toList
〜〜〜