Semantik Penyalinan
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 39 dari 57.
Object S3 dan S4 adalah nilai: fungsi yang mengubah salah satunya hanya mengubah salinannya sendiri. Object RC adalah referensi: object milik pemanggil berubah. Fungsi yang sama berperilaku berbeda pada kedua jenis ini:
setClass("S4Box", slots = c(n = "numeric"))
RCBox <- setRefClass("RCBox", fields = list(n = "numeric"))
bump_s4 <- function(b) { b@n <- b@n + 1; invisible(b) }
bump_rc <- function(b) b$n <- b$n + 1
v <- new("S4Box", n = 1)
r <- RCBox$new(n = 1)
bump_s4(v)
bump_rc(r)
cat(v@n, r$n)Output:
1 2$copy() membuat object baru yang independen dengan nilai field yang sama. Mengubah salinannya tidak memengaruhi object asli:
Account <- setRefClass("Account", fields = list(balance = "numeric"))
a <- Account$new(balance = 100)
alias <- a
backup <- a$copy()
alias$balance <- 0
cat(a$balance, backup$balance)Output:
0 100list dapat menyimpan object RC yang sama beberapa kali. Mengubah satu elemen akan mengubah semuanya. Buat object baru untuk setiap elemen jika masing-masing harus berdiri sendiri:
Counter <- setRefClass("Counter", fields = list(n = "numeric"))
one <- Counter$new(n = 0)
same <- list(one, one, one)
same[[1]]$n <- 5
fresh <- lapply(1:3, function(i) Counter$new(n = 0))
fresh[[1]]$n <- 5
cat(same[[3]]$n, fresh[[3]]$n)Output:
5 0identical(a, b) bernilai TRUE untuk dua nama dari object RC yang sama, dan FALSE untuk salinannya, meskipun field-nya masih sama:
Account <- setRefClass("Account", fields = list(balance = "numeric"))
a <- Account$new(balance = 100)
b <- a
c2 <- a$copy()
cat(identical(a, b), identical(a, c2), c2$balance == a$balance)Output:
TRUE FALSE TRUETantangan
MudahEditor teks menyimpan titik penyimpanan. Deklarasikan Reference Class Document di Document.R dengan field text (character) dan method type(s) yang menambahkan s ke teks. Lalu tulis checkpoint(doc), yang mengembalikan salinan dokumen yang independen.
Definisi dengan method dibungkus dalam suppressMessages(). Kode yang disediakan dimulai dengan titik penyimpanan, lalu membaca perintah: save menyimpan checkpoint(doc), undo kembali ke salinan titik penyimpanan terakhir, dan baris lainnya diketik. Kode mencetak teks dan teks yang disimpan setelah setiap perintah, jadi titik penyimpanan tidak boleh berubah saat pengetikan berlanjut.
Tulis kodemu di Document.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
source("Document.R")
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
doc <- Document$new(text = "")
saved <- checkpoint(doc)
for (cmd in input) {
if (cmd == "save") {
saved <- checkpoint(doc)
} else if (cmd == "undo") {
doc <- checkpoint(saved)
} else {
doc$type(cmd)
}
cat(cmd, " -> [", doc$text, "] saved [", saved$text, "]\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