先做最重要的事
有一個特殊的 public 方法叫做 initialize()(注意美式英文拼法)。使用者不會直接呼叫它。當建立物件時會自動呼叫它;也就是使用者呼叫 new() 時。
initialize() 讓你在建立 R6 物件時設定 private 欄位的值。initialize() 函式的典型寫法如下:
thing_factory <- R6Class(
"Thing",
private = list(
a_field = "a value",
another_field = 123
),
public = list(
initialize = function(a_field, another_field) {
if(!missing(a_field)) {
private$a_field <- a_field
}
if(!missing(another_field)) {
private$another_field <- another_field
}
}
)
)
注意 missing()(說明文件)的用法。若在函式呼叫中沒有傳入某個引數,它會回傳 TRUE。
工廠的 new() 方法所接收的引數會傳遞給 initialize()。
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
本練習屬於課程
在 R 中使用 S3 與 R6 的物件導向程式設計
練習說明
已為你部分定義了一個微波爐工廠。
- 新增一個名為
initialize()的 public 方法。這應該允許使用者在建立物件時設定power_rating_watts和door_is_open欄位。- 引數應為
power_rating_watts與door_is_open。 - 在
initialize()方法的主體中,對每個引數,如果不是missing()(說明文件),就設定對應的 private 欄位。
- 引數應為
- 建立一個功率為
650瓦且門是開啟的微波爐物件。- 呼叫
microwave_oven_factory的new()方法。 - 將引數
power_rating_watts = 650與door_is_open = TRUE傳給new()。 - 把結果指定給
a_microwave_oven。
- 呼叫
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
# Add an initialize method
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
power_rating_watts = 800,
door_is_open = FALSE
),
public = list(
cook = function(time_seconds) {
Sys.sleep(time_seconds)
print("Your food is cooked!")
},
open_door = function() {
private$door_is_open <- TRUE
},
close_door = function() {
private$door_is_open <- FALSE
},
# Add initialize() method here
___ = ___(___, ___) {
if(!missing(power_rating_watts)) {
private$power_rating_watts <- power_rating_watts
}
___
}
)
)
# Make a microwave
a_microwave_oven <- ___