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] 150Setiap 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 5Data 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] 100Method 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] 10Tantangan
MudahLengkapi 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 = "")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar S3
Bekerja dengan fileList dengan classFungsi KonstruktorMethod print dan formatValidator dan helperUlasan: Suhu4Enkapsulasi di R
Closure sebagai objectEnvironment sebagai objectFungsi accessorMelindungi stateRangkuman: Meter Parkir2S3 Generics dan Method
Generics dan UseMethodMethod DefaultMethod untuk Base GenericsDasar-Dasar NextMethodRekap: Luas Bangun5S4 class
Mendefinisikan class S4Slots dan AksesPemeriksaan ValiditasMethod showRingkasan: Katalog Produk8Kelas Referensi
Mendefinisikan Kelas ReferensiPembaruan method dan fieldSemantik PenyalinanPewarisan dan callSuperRangkuman: Antrean Tugas11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam BukuLatihan sendiri: Compiler R online