Scalaでクラスを継承したときのコンストラクタのパラメータ
newするときに渡す引数は、子クラス定義時も親クラス名といっしょに指定しないといけない。
class Hoge(a: Int) class Fuga extends Hoge // error: not enough arguments for constructor Hoge: (a: Int)Hoge. class Fuga(a: Int) extends Hoge(a) // ok // Fugaの引数がHogeに渡される
デフォルト引数が親クラスで設定されているときは、指定しなくてもいい。
あるいは、子クラス定義の時に変更できる。
class Bar(val a: Int = 123, val b: Int = 234) class Baz() extends Bar val baz = new Baz() baz.a //=> 123 baz.b //=> 234 class Foo() extends Bar(b = 345) // 名前付き引数で渡す val foo = new Foo() foo.a //=> 123 foo.b //=> 345
Scalaのクラスのコンストラクタの引数の可視性
valをつけるとattr_reader、varをつけるとattr_accessorになる。(Perl日記だけどRubyで例える)
何もつけないと、privateになる。
// aは何もつけない、bはval、cはvar class Hoge(a: Int, val b: Int, var c: Int) { def getA = a } val hoge = new Hoge(123, 234, 345) // READ hoge.a // error: value a is not a member of Hoge hoge.b //=> 234 hoge.c //=> 345 hoge.getA //=> 123 // WRITE hoge.a = 444 // error: value a is not a member of Hoge hoge.b = 444 // error: reassignment to val hoge.c = 444 //=> 444
ケースクラスの場合は、何もつけないのが上記の普通のクラスのvalにあたる。
case class Bar(a: Int, val b: Int, var c: Int) val bar = Bar(123, 234, 345) // READ bar.a //=> 123 bar.b //=> 234 bar.c //=> 345 // WRITE bar.a = 444 // error: reassignment to val bar.b = 444 // error: reassignment to val bar.c = 444 //=> 444
ScalaでCharをtoIntすると文字コードになる
はまったのでメモ。
"1234567890" という文字列を List(1,2,3,4,5,6,7,8,9,0) という形にしたい。
やってみた。
"1234567890".toList //=> List[Char] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 0) "1234567890".toList.map(_.toInt) //=> List[Int] = List(49, 50, 51, 52, 53, 54, 55, 56, 57, 48)
なんか値がおかしい。
調べたら、CharのtoIntは文字コード変換になるようだ。
なので、toStringをかますと一応ちゃんと動く。
"1234567890".toList.map(_.toString.toInt) //=> List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
またasDigitを使えば一発でいける。
"1234567890".toList.map(_.asDigit) //=> List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)