靜電
R6 類別可以利用 environment 的「參照式複製」行為,讓多個物件共享欄位。若要設定此機制,請定義一個名為 shared 的私有欄位。這個欄位需要用多行來定義。它應該:
- 建立一個新的 environment。
- 將任何要共享的欄位指派到該 environment。
- 回傳此 environment。
共享欄位應透過主動繫結(active binding)來存取。這些繫結和你先前看過的用法相同,但會使用 private$shared$ 前綴來取得欄位。
R6Class(
"Thing",
private = list(
shared = {
e <- new.env()
e$a_shared_field <- 123
e
}
),
active = list(
a_shared_field = function(value) {
if(missing(value)) {
private$shared$a_shared_field
} else {
private$shared$a_shared_field <- value
}
}
)
)
請注意,主動繫結的名稱必須與你要讀寫的共享欄位名稱相同;在上例中兩者都是 a_shared_field。
本練習屬於課程
在 R 中使用 S3 與 R6 的物件導向程式設計
練習說明
已為你部分定義了一個 MicrowaveOven 類別。
- 在
MicrowaveOven類別的 private 區塊中,更新名為shared的欄位。- 這個欄位應包含以大括號
{}包起來的三行程式碼。 - 首先呼叫
new.env()(文件)建立一個名為e的新 environment,然後…… - 在
e中指派一個名為safety_warning的變數,值為"Warning. Do not try to cook metal objects.",然後…… - 回傳該 environment。
- 這個欄位應包含以大括號
- 新增一個名為
safety_warning的主動繫結,用來讀取或設定私有共享的safety_warning欄位。- 在
active區塊內將它定義為一個函式。 - 它接受一個名為
value的單一參數。 - 它應該讀取或設定
private$shared$safety_warning。
- 在
- 建立兩個
MicrowaveOven物件,分別命名為a_microwave_oven與another_microwave_oven。 - 將
a_microwave_oven的safety_warning欄位改為"Warning. If the food is too hot you may scald yourself."。 - 檢視
another_microwave_oven的safety_warning欄位,確認它已經被修改。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
# Complete the class definition
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
shared = {
# Create a new environment named e
___
# Assign safety_warning into e
___
# Return e
___
}
),
active = list(
# Add the safety_warning binding
safety_warning = ___(___) {
if(___(___)) {
___
} else {
___ <- ___
}
}
)
)
# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
# Verify that the warning has change for another_microwave
___