読者です 読者をやめる 読者になる 読者になる

プロパティとgetter/setter

Scala

Scalaの勉強を始めたが、第一印象としては「結構普通の言語だな」という感じ。Erlangのような「なんだこれ」感があまりない。言語リファレンスとかチュートリアルがほとんどPDFのみでHTML版がないのは勘弁して欲しい。

下はこのページのコードを写経してみたもの。

object timeofday {
  class DataError extends Exception

  class TimeOfDayVar {
    private var h, m, s: Int = 0

    def hours = h
    def hours_= (h: Int) =
      if (0 <= h && h < 24) {
        this.h = h
      } else {
        throw new DataError()
      }

    def minutes = m
    def minutes_= (m: Int) =
      if (0 <= m && m < 60) {
        this.m = m
      } else {
        throw new DataError()
      }

    def seconds = s
    def seconds_= (s: Int) =
      if (0 <= s && s < 60) {
        this.s = s
      } else {
        throw new DataError()
      }
  }

  def main(args: Array[String]) {
    val d = new TimeOfDayVar
    d.hours = 8; d.minutes = 30; d.seconds = 0
    // throws a DataError exception
    d.hours = 25
  }
}

setterの定義の仕方に少々戸惑ったが、言語リファレンスやこのページを読んで、

f.x = e

が、

f.x_=(e)

に解釈されると、とりあえずのところは理解した。
上のコードを写経していて「Pythonっぽいな」と思ったが、言語仕様的にはよりRubyに近いのかもしれない。

class DataException(Exception):
    pass

class TimeOfDayVar(object):
    def __init__(self):
        self.__h = self.__m = self.__s = 0

    def set_hours(self, h):
        if 0 <= h and h < 24:
            self.__h = h
        else:
            raise DataException()
    hours = property(lambda x: x.__h, set_hours)

    def set_minutes(self, m):
        if 0 <= m and m < 60:
            self.__m = m
        else:
            raise DataException()
    minutes = property(lambda x: x.__m, set_minutes)

    def set_seconds(self, s):
        if 0 <= s and s < 60:
            self.__s = s
        else:
            raise DataException()
    seconds = property(lambda x: x.__s, set_seconds)

if __name__ == '__main__':
    d = TimeOfDayVar()
    d.hours = 8; d.minutes = 30; d.seconds = 0
    # throws a DataError exception
    d.hours = 25