紹介
Object#withが便利だったので紹介
こういうクラスを用意する
class Player
attr_accessor :number
def initialize(number:)
self.number = number
end
def puts_number
puts number
end
end
このようなクラスで、puts_number
メソッドだけ動作を確認したい時がある
前後に処理がある中で動作確認をするとき、動作確認後は値を戻したい場合にはこういうコードになる
player = Player.new(number: 2)
begin
player.number = 3
player.puts_number
ensure
player.number = 2
end
player.puts_number
実行すると出力は
3
2
のようになる
これはこれでいいのだが、便利なメソッドがある
それがこれ
player = Player.new(number: 2)
player.with(number: 3) do
player.puts_number
end
player.puts_number
実行すると先ほどと同じく
3
2
となる
Object#withの内部実装もわかりやすい
def with(**attributes)
old_values = {}
begin
attributes.each do |key, value|
old_values[key] = public_send(key)
public_send("#{key}=", value)
end
yield
ensure
old_values.each do |key, old_value|
public_send("#{key}=", old_value)
end
end
end
最初のコードとほぼ同じ
これからはこれを使っていこう