🎃
[bugs.ruby][Feature #20300] Hash の更新と更新前の値を取得するメソッドを追加する提案
[Feature #20300] Hash: set value and get pre-existing value in one call
- 『Hash を更新しつつ、更新前の値を取得する』場合に以下のように同じ要素に対して2回参照する必要がある
h = { k: "old value" }
# 1. :k を参照して更新前の値を取得する
old_value = h[:k]
# 2. もう一度 :k を参照して更新を行う
h[:k] = "new value"
use(old_value)
- このときに Symbol 以外でアクセスした場合に
#hash
や#eql?
を呼び出すコストがかかる - なのでこれをまとめて操作する
Hash#update_value
を追加する提案 - Ruby だと以下のような感じ
- 実際には参照を1回にするために C で実装する必要がある
class Hash
def update_value(key, new_value)
old_value = self[key]
self[key] = new_value
old_value
end
end
- 既に PR は出ていていまは名前をどうするのかって議論がされている
- またこのメソッドを利用したいユースケースは [Bug #20301]
Set#add?
does two hash look-ups を参照
Discussion