LoginSignup
1
0

More than 3 years have passed since last update.

ActiveSupportのslice!メソッドがトリッキーな動きをする

Posted at

経緯

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!メソッドのコードを見るとそう書いてあるので、なるほどという感じ。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0