出力の制御
アクティブバインディングは、プライベートフィールドの設定にも使えます。この場合、バインディング関数は "value" という名前の1つの引数を受け取る必要があります。
読み書き可能なアクティブバインディングを作るパターンは次のとおりです。
thing_factory <- R6Class(
"Thing",
private = list(
..a_field = "a value"
),
active = list(
a_field = function(value) {
if(missing(value)) {
private$..a_field
} else {
assert_is_a_string(value) # または別のアサーション
private$..a_field <- value
}
}
)
)
値の代入は、バインディングが関数ではなくデータ変数であるかのように行います。
a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # a_thing$a_field("a new value") ではありません
この演習はコースの一部です
R における S3 と R6 を使ったオブジェクト指向プログラミング
演習の手順
電子レンジのクラスが一部定義されています。
- 電子レンジクラスの定義を拡張して、
activeリスト要素を追加してください。 active要素に、出力(パワー)レベルを制御するアクティブバインディングを追加してください。- 電子レンジオブジェクトを作成し、
a_microwave_ovenに代入してください。 - 現在の出力レベルを取得してください。
- 文字列の
"400"を出力レベルに設定しようとしてみてください。 - 出力レベルを
1600に設定しようとしてみてください。 - 出力レベルを
400に設定してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Add a binding for power rating
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
..power_rating_watts = 800,
..power_level_watts = 800
),
# Add active list containing an active binding
___ = ___(
___ = ___(___) {
if(missing(___)) {
# Return the private value
___
} else {
# Assert that value is a number
___
# Assert that value is in a closed range from 0 to power rating
___
# Set the private power level to value
___ <- ___
}
}
)
)
# Make a microwave
a_microwave_oven <- ___
# Get the power level
___
# Try to set the power level to "400"
___ <- ___
# Try to set the power level to 1600 watts
___ <- ___
# Set the power level to 400 watts
___ <- ___