Menu
CoddyTech

Pembaruan method dan field

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

Method diletakkan dalam list methods dari setRefClass(). Di dalam method, field ditulis sebagai nama biasa, dan <<- mengubah field. Di Coddy runner, R mencetak catatan tentang package codetools yang bersifat opsional saat class dengan method didefinisikan, jadi bungkus definisinya dengan suppressMessages():

Counter <- suppressMessages(setRefClass("Counter",
  fields = list(count = "numeric"),
  methods = list(
    add = function(n = 1) {
      count <<- count + n
    },
    report = function() paste("count is", count)
  )
))
c1 <- Counter$new(count = 0)
c1$add()
c1$add(5)
print(c1$report())

Output:

[1] "count is 6"

.self adalah object tempat method dipanggil. Method yang diakhiri dengan invisible(.self) mengembalikan object tersebut, sehingga pemanggilan dapat dirangkai:

Counter <- suppressMessages(setRefClass("Counter",
  fields = list(count = "numeric"),
  methods = list(
    add = function(n = 1) {
      count <<- count + n
      invisible(.self)
    }
  )
))
c1 <- Counter$new(count = 0)
c1$add(2)$add(3)$add(4)
print(c1$count)

Output:

[1] 9

Method initialize berjalan di dalam $new(). initFields(...) menetapkan field yang diberikan, setelah itu method dapat memberikan nilai default kepada field lainnya. Method saling memanggil dengan namanya:

Account <- suppressMessages(setRefClass("Account",
  fields = list(owner = "character", balance = "numeric"),
  methods = list(
    initialize = function(...) {
      initFields(...)
      if (length(balance) == 0) balance <<- 0
      invisible(.self)
    },
    deposit = function(x) balance <<- balance + x,
    deposit_twice = function(x) {
      deposit(x)
      deposit(x)
    }
  )
))
a <- Account$new(owner = "Ada")
a$deposit_twice(10)
print(a$balance)

Output:

[1] 20

Di dalam method, <- biasa pada nama field membuat variabel lokal dengan nama tersebut dan membiarkan field tetap tidak berubah. Gunakan <<- untuk setiap perubahan pada field:

Counter <- suppressMessages(setRefClass("Counter",
  fields = list(count = "numeric"),
  methods = list(
    broken = function() count <- count + 1,
    working = function() count <<- count + 1
  )
))
c1 <- Counter$new(count = 0)
c1$broken()
c1$broken()
c1$working()
print(c1$count)

Output:

[1] 1
challenge icon

Tantangan

Mudah

Lengkapi Reference Class Stack di Stack.R. Class ini menyimpan itemnya di field items (character, item teratas berada di posisi terakhir) dan memiliki empat method:

  • push(x) menambahkan x ke bagian atas dan mengembalikan invisible(.self), sehingga pemanggilan push dapat dirangkai;
  • pop() menghapus dan mengembalikan item teratas, atau mengembalikan nothing saat stack kosong;
  • peek() mengembalikan item teratas tanpa menghapusnya, atau nothing;
  • size() mengembalikan jumlah item.

Definisinya sudah dibungkus dengan suppressMessages(). Kode yang disediakan membaca perintah push a b, pop, dan peek, lalu menambahkan dua item lagi dalam satu pemanggilan berantai dan mencetak ukurannya.

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

Coba sendiri

source("Stack.R")

# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
s <- Stack$new()
for (cmd in input) {
  if (startsWith(cmd, "push ")) {
    items <- strsplit(substring(cmd, 6), " ")[[1]]
    for (it in items) s$push(it)
  } else if (cmd == "pop") {
    cat("popped ", s$pop(), "\n", sep = "")
  } else if (cmd == "peek") {
    cat("top ", s$peek(), "\n", sep = "")
  }
}
s$push("x")$push("y")
cat("size after two chained pushes: ", s$size(), "\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