経緯
ActiveRecordのvalidationメソッドを読んでいて出てきたActiveSupporのslice!
メソッドがトリッキーと自分には感じる動きをしたので書いた。
Railsはv5.2.3。
【PR】ちなみにこういうったコードリーディングの勉強会をよく開催しているので興味ありましたらこちらのリンクを見てね!過去開催例はこちら。
概要
-
slice
メソッドの動作はこうなります。引数に渡されたkeyをHashとして返します。またもちろんレシーバーには影響はありません。
[43] pry(main)> require 'active_support'
=> true
[44] pry(main)> require 'active_support/core_ext'
=> true
[60] pry(main)> some_hash = {
[60] pry(main)* key_a: "some content",
[60] pry(main)* key_b: "some content",
[60] pry(main)* key_c: "some content"
[60] pry(main)* }
=> {:key_a=>"some content", :key_b=>"some content", :key_c=>"some content"}
[61] pry(main)> some_hash.slice(:key_a, :key_b)
=> {:key_a=>"some content", :key_b=>"some content"}
[62] pry(main)> some_hash
=> {:key_a=>"some content", :key_b=>"some content", :key_c=>"some content"}
- 一方
slice!
メソッドはこうなります。引数に渡されたkeyをHashとして返ってきて、渡されなかったものがレシーバーから消されるのかな、と思ったらその逆でした。渡されなかったkeyのHashが返ってきて、返ってきたものはレシーバーから消されます。言い換えると、引数にはレシーバーに残したいkeyを指定するということになります。
[63] pry(main)> some_hash.slice!(:key_a)
=> {:key_b=>"some content", :key_c=>"some content"}
[64] pry(main)> some_hash
=> {:key_a=>"some content"}
コードを見てみる
sliceメソッドのコードと、slice!メソッドのコードを見るとそう書いてあるので、なるほどという感じ。
参考