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の値によって処理をディスパッチさせればできます。