Perl日記

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

初めて無職になった。まだニートではない

12月。



1日に突然会社がなくなるというアナウンスがある。
メインタイトルのアプリが違う会社に買い取られることになったので、アプリと一緒にその会社に転籍するかここで辞めるか10日で決めろと言われる。



10日。転籍条件があれだったので、辞めることにする。



11日から有給休暇の消化と、引き継ぎドキュメントを書いたりする。



有給消化。積みゲーと積み小説と積み勉強も消化しながら、旅行とか自炊をする。
オブジェクト指向ドメイン駆動設計、Scalaの本を読む。
有給は5日くらい残ってもったいなかった。



年末年始。ゴロゴロする。



2016年。就職活動しながら、Scalaを勉強する。

Scalaの変位指定アノテーションと上限・下限境界がわからない

LL脳には辛い。
説明を読んでるときには、「なるほどなー」、と思うんだけど、いざ出てくると「どういう意味だっけ…」ってなるし、「いつ使えばいいんだ…」ってなってる。

classだけではなくて、defにも使えるので、混乱する。。。


とりあえずこれは理解した。

class Aaa
class Bbb extends Aaa
class Ccc extends Bbb



class D[T >: Bbb]


val dAaa = new D[Aaa] // dAaa: D[Aaa] = D@4b2bac3f

val dBbb = new D[Bbb] // dBbb: D[Bbb] = D@4988d8b8

val dCcc = new D[Ccc]
// error: type arguments [Ccc] do not conform to class D's type parameter bounds [T >: Bbb]



class E[T <: Bbb]


val eAaa = new E[Aaa]
// error: type arguments [Aaa] do not conform to class E's type parameter bounds [T <: Bbb]

val eBbb = new E[Bbb] // eBbb: E[Bbb] = E@2cd2a21f

val eCcc = new E[Ccc] // eCcc: E[Ccc] = E@3514a4c0

上限境界と下限境界は、定義したクラスとかメソッドとかに渡す時にチェックするってことかな。

Scalaにおける表明

assert()

def add100(x: Int): Int = {
  val z = x + 100
  assert(z >= 0) // 必ず0以上という表明
  z
}

ensuring()

def add100(x: Int): Int = {
  val z = x + 100
  z ensuring(_ >= 0)
}

// ↑こう書けるので、↓こうも書ける

def add100(x: Int): Int = x + 100 ensuring(_ >= 0)

assert()もensuring()も失敗すれば、java.lang.AssertionError例外が投げられる。

add100(-101)
// java.lang.AssertionError: assertion failed

require()

前提条件のチェックにはrequire()が使える。
失敗すると、java.lang.IllegalArgumentException例外が投げられる。

def minus3(x: Int): Int = {
  require(x > 3)
  x - 3
}
minus3(2)
// java.lang.IllegalArgumentException: requirement failed