なんじゃくにっき

プログラミングの話題中心。

R言語 クロージャーで簡易OOP

Wikipediaクロージャーの項のカウンターのプログラムをRで書いてみます。
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3



counterGenerator <- function (count = 0) {
function() {
count <<- count + 1
count
}
}

counter = counterGenerator()

cat(counter()) # 1
cat(counter()) # 2
cat(counter()) # 3

はい、簡単にできました。


呼び出す度に1加算するだけではつまらないので、
加算する量を指定できるようにしましょう。
また、減算もできるようにしましょう。
さらに現在のカウントを表示する機能も付けます。
戻り値を名前付きリストで返すようにすればOKです。


counterGenerator <- function (count = 0) {
list(
show = function() {
cat(count)
},
plus = function(arg = 1) {
count <<- count + arg
},
minus = function(arg = 1) {
count <<- count - arg
}
)
}

counter <- counterGenerator()

counter$show() # 0
counter$plus()
counter$show() # 1
counter$plus(10)
counter$show() # 11
counter$minus(2)
counter$show() # 9


これで簡単なオブジェクト指向プログラミングができました。
カウンターオブジェクトが内部にカウントを持ち、
直接外からはアクセスできませんが、メソッドに相当するもの(show, plus, minus)
を使ってアクセスできます(カプセル化)。

オーバーロードポリモルフィズム)とオーバーライド(インヘリタンス)はこのコードではありませんが、
オーバーロードはメソッド内部でtypeofの値によって処理をディスパッチさせればできます。