Menu
CoddyTech

Closure sebagai object

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 17 dari 57.

Kamu telah mempelajari closure di Logic & Flow: fungsi yang dibuat di dalam fungsi lain menyimpan variabel di sekitarnya. Factory fungsi yang mengembalikan list berisi fungsi-fungsi seperti itu akan membangun sebuah object. Variabel lokalnya adalah data object tersebut, dan fungsi-fungsinya adalah method-nya:

make_account <- function(balance = 0) {
  deposit <- function(x) balance <<- balance + x
  get_balance <- function() balance
  list(deposit = deposit, get_balance = get_balance)
}
acc <- make_account(100)
acc$deposit(50)
print(acc$get_balance())

Output:

[1] 150

Setiap pemanggilan factory menjalankan kembali isi fungsinya, sehingga setiap object memiliki variabelnya sendiri. Mengubah satu akun tidak memengaruhi akun lainnya:

make_account <- function(balance = 0) {
  list(deposit = function(x) balance <<- balance + x,
       get_balance = function() balance)
}
ada <- make_account(100)
bo <- make_account(5)
ada$deposit(1)
cat(ada$get_balance(), bo$get_balance())

Output:

101 5

Data ini bersifat privat. balance bukan elemen dari list, jadi acc$balance bernilai NULL dan menetapkan nilai padanya hanya menambahkan elemen yang tidak terkait. Fungsi-fungsi dalam list tersebut merupakan seluruh antarmuka publik object:

make_account <- function(balance = 0) {
  list(get_balance = function() balance)
}
acc <- make_account(100)
print(acc$balance)
acc$balance <- 1e6
print(acc$get_balance())

Output:

NULL
[1] 100

Method dapat saling memanggil jika didefinisikan sebagai fungsi lokal sebelum list dibuat. Di sini, add_many() menggunakan kembali add():

make_tally <- function() {
  total <- 0
  add <- function(x) total <<- total + x
  add_many <- function(xs) for (x in xs) add(x)
  get <- function() total
  list(add = add, add_many = add_many, get = get)
}
t <- make_tally()
t$add(1)
t$add_many(c(2, 3, 4))
print(t$get())

Output:

[1] 10
challenge icon

Tantangan

Mudah

Lengkapi factory make_counter(start = 0) di Counter.R. Factory ini menjaga nilai saat ini tetap privat dan mengembalikan list dengan empat fungsi: increment() dan decrement() mengubah nilai sebesar 1, reset() mengembalikannya ke start, dan value() mengembalikannya.

Kode yang disediakan membaca nilai awal, lalu perintah +, -, atau reset, dan mencetak nilainya setelah setiap perintah. Pada akhirnya, kode mencetak nama-nama dalam list yang dikembalikan, yang hanya boleh berisi empat fungsi tersebut.

Tulis kodemu di Counter.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

source("Counter.R")

# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
counter <- make_counter(as.numeric(input[1]))
for (cmd in input[-1]) {
  if (cmd == "+") counter$increment()
  if (cmd == "-") counter$decrement()
  if (cmd == "reset") counter$reset()
  cat(cmd, " -> ", counter$value(), "\n", sep = "")
}
cat("fields visible: ", paste(sort(names(counter)), collapse = ", "), "\n", sep = "")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler R online