先从初始化开始
有一个特殊的公共方法名为 initialize()(注意是美式拼写)。用户不会直接调用它。它会在创建对象时自动调用;也就是说,当用户调用 new() 时触发。
initialize() 允许您在创建 R6 对象时设置私有字段的值。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()的公共方法。这应允许用户在创建对象时设置power_rating_watts和door_is_open字段。- 参数应为
power_rating_watts和door_is_open。 - 在
initialize()方法体内,对每个参数,如果它不是missing()(文档),则应设置对应的私有字段。
- 参数应为
- 创建一个功率为
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 <- ___