Menu
Coddy logo textTech

Nesne Olarak Ortamlar

Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 18 / 57.

Bir ortam, new.env() ile oluşturulan liste gibi adlandırılmış değerler kümesidir. Fark şu ki bir ortam asla kopyalanmaz: ona başvuran her değişken aynı nesneyi görür, bu nedenle bir ad üzerinden yapılan değişiklik tüm adlar üzerinden görülebilir:

e <- new.env()
e$count <- 1
alias <- e
alias$count <- 99
print(e$count)
l <- list(count = 1)
copy <- l
copy$count <- 99
print(l$count)

Çıktı:

[1] 99
[1] 1

Bir ortam alan bir işlev, çağıranın nesnesini değiştirir. Herhangi bir şey döndürmesi gerekmez ve çağıran bir sonuç atamaz:

deposit <- function(acc, x) acc$balance <- acc$balance + x
acc <- new.env()
acc$balance <- 10
deposit(acc, 5)
deposit(acc, 5)
print(acc$balance)

Çıktı:

[1] 20

assign(), get() ve exists() bir değişkende tutulan adla çalışır; ls() ise bir ortamda bulunan adları sıralanmış düzende listeler:

e <- new.env()
for (fruit in c("pear", "apple")) assign(fruit, nchar(fruit), envir = e)
print(ls(e))
print(get("pear", envir = e))
print(exists("kiwi", envir = e))

Çıktı:

[1] "apple" "pear" 
[1] 4
[1] FALSE

class özniteliğine sahip bir ortam, başvuru semantiğine sahip bir S3 nesnesidir: yöntemleri her zamanki gibi çalışır ve onu değiştiren işlevler değişiklikleri yerinde yapar:

new_wallet <- function(coins = 0) {
  w <- new.env()
  w$coins <- coins
  class(w) <- "wallet"
  w
}
print.wallet <- function(x, ...) {
  cat("wallet with", x$coins, "coins\n")
  invisible(x)
}
spend <- function(w, n) w$coins <- w$coins - n
w <- new_wallet(10)
spend(w, 3)
w

Çıktı:

wallet with 7 coins
challenge icon

Görev

Kolay

Bir envanter, tek bir değişkeni olan, stok bilgilerini içeren adlandırılmış sayısal bir vektör olan items'a sahip inventory sınıfında bir ortamdır. Inventory.R dosyasını tamamlayın:

  • new_inventory(), boş bir items (c() kullanılabilir) ve sınıf ile ortamı oluşturur.
  • add_stock(inv, item, n), yeni bir öğe için 0'dan başlayarak öğenin stokuna n ekler.
  • take_stock(inv, item, n), yeterli stok olduğunda n miktarını çıkarır ve TRUE döndürür; aksi takdirde hiçbir şeyi değiştirmez ve FALSE döndürür.
  • stock_of(inv, item), bilinmeyen bir öğe için 0 olmak üzere stok miktarını döndürür.

Fonksiyonlar envanteri yerinde değiştirir ve envanteri döndürmez. Sağlanan kod, add apple 5 ve take apple 2 komutlarını okur, her take işleminin sonucunu yazdırır, ardından her öğeyi alfabetik sırayla yazdırır.

Kodunuz Inventory.R dosyasına yazılmalıdır. main.R dosyası sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Inventory.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
inv <- new_inventory()
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  n <- as.numeric(p[3])
  if (p[1] == "add") add_stock(inv, p[2], n)
  if (p[1] == "take") cat("take ", p[2], ": ", if (take_stock(inv, p[2], n)) "ok" else "not enough", "\n", sep = "")
}
for (item in sort(names(inv$items))) cat(item, ": ", stock_of(inv, item), "\n", sep = "")
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Tabanlı Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi