Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

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)