default[]などは代入元にnode[]が使えるが、自己参照で発散したりしないか気になったので、少し試して見た。
recipes/default.rb
node.default['foo'] = 'bar'
log node['foo'] #=> * log[bar] action write
node.default['foo'] = 'baz'
log node['foo'] #=> * log[baz] action write
# node[]の値はその時点で判断される。
# ならば自己参照による発散もない。
node.default['foo'] = node['foo']
log node['foo'] #=> * log[baz] action write
node.default['foo'] = node['foo'] * 2
log node['foo'] #=> * log[bazbaz] action write
# 当然発散しない
node.force_default['foo'] = 'qux'
log node['foo'] #=> * log[qux] action write
# 高優先順位で設定
node.default['foo'] = 'quux'
log node['foo'] #=> * log[qux] action write
# 低優先順位の設定は表に出てこれない
log node.default['foo'] #=> * log[quux] action write
log node.force_default['foo'] #=> * log[qux] action write
# 低優先順位の値も内部的には保持し続けている
# node[]は保持している値の中で、その時点でもっとも優先順位の高い値を返すだけ
発散しない。
node[]は都度収束される。