1. Learn
  2. /
  3. Courses
  4. /
  5. R における S3 と R6 を使ったオブジェクト指向プログラミング

Connected

Exercise

静電気

R6 クラスは、環境の参照渡しによるコピーの挙動を利用して、オブジェクト間でフィールドを共有できます。これを設定するには、shared という名前のプライベートフィールドを定義します。このフィールドは複数行で定義し、次を行う必要があります。

  • 新しい環境を作成する。
  • 共有するフィールドをその環境に代入する。
  • その環境を返す。

共有フィールドにはアクティブバインディング経由でアクセスします。これは、これまで見てきた他のアクティブバインディングと同様に動作しますが、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 です。

Instructions

100 XP

MicrowaveOven クラスが一部まで定義されています。

  • MicrowaveOven クラスの private 要素にある shared フィールドを更新します。
    • このフィールドは中括弧 {} で囲まれた3行のコードを含みます。
    • まず new.env()(docs)を呼び出して e という新しい環境を作成し、次に…
    • e に safety_warning という変数を代入し、値は "Warning. Do not try to cook metal objects." とします。その後に…
    • その環境を返します。
  • プライベートな共有フィールド safety_warning を取得・設定する、safety_warning という名前のアクティブバインディングを追加します。
    • これは active 要素内の関数として定義します。
    • 引数は value の1つです。
    • private$shared$safety_warning を取得・設定するようにします。
  • MicrowaveOven オブジェクトを2つ作成し、それぞれ 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 フィールドを確認します。