複製人大進擊(2)
如果一個 R6 物件在一個或多個欄位中包含了另一個 R6 物件,則預設情況下,clone() 會以參考方式複製這些 R6 欄位。若要以值的方式複製這些 R6 欄位,必須在呼叫 clone() 方法時傳入引數 deep = TRUE。
a_deep_copy <- an_r6_object$clone(deep = TRUE)
本練習屬於課程
在 R 中使用 S3 與 R6 的物件導向程式設計
練習說明
你的工作空間中已預先定義描述微波爐電源插頭的 PowerPlug R6 類別。MicrowaveOven 類別已更新,包含一個 PowerPlug 物件。
- 建立一個
MicrowaveOven物件並指定給a_microwave_oven。 - 使用沒有引數的
clone()方法,將微波爐複製到名為cloned_microwave_oven的變數中。 - 使用
clone()方法並傳入deep = TRUE,將微波爐複製到名為deep_cloned_microwave_oven的變數中。 - 將
a_microwave_oven的power_plug欄位中的type欄位改為"British"。 - 驗證
a_microwave_oven與cloned_microwave_oven的power_plug$type欄位相同。 - 驗證
a_microwave_oven與deep_cloned_microwave_oven的power_plug$type欄位不同。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
# Create a microwave oven
a_microwave_oven <- microwave_oven_factory$new()
# Look at its power plug
a_microwave_oven$power_plug
# Copy a_microwave_oven using clone(), no args
cloned_microwave_oven <- ___
# Copy a_microwave_oven using clone(), deep = TRUE
deep_cloned_microwave_oven <- ___
# Change a_microwave_oven's power plug type
___$___ <- ___
# Check a_microwave_oven & cloned_microwave_oven same
identical(___, ___)
# Check a_microwave_oven & deep_cloned_microwave_oven different
identical(___, ___)