String
なのか Symbol
なのか
Ruby には Symbol
という、文字列の皮を被った数値があり、少メモリで高速なことから、Hash
のキーとかでよく見かけます。
自分で作った Hash
であれば誤解はないですが、メソッドから生成された Hash
のキーが String
だったりすると、キーを指定しても nil
が返ってきて、「俺が入れたデータが無くなっとる!」と焦ります。
JSON.parse
は symbolize_names: true
をつけると Symbol
JSON.parse
でそのままだと、キーは String
になる。
JSON.parse('{"name":"tanaka","age":19}')
=> {"name"=>"tanaka", "age"=>19}
symbolize_names: true
をつけるとキーが Symbol
になります。
SON.parse('{"name":"tanaka","age":19}', symbolize_names: true)
=> {:name=>"tanaka", :age=>19}
ActionController::Parameters
は Symbol
と String
両方で参照可能だが
Rails の parameter は Symbol
と String
両方で参照できます。
params[:email]
=> "sample@example.com"
params['email']
=> "sample@example.com"
ただし、他の Hash に merge
しようとすると String
しか残らないので、Symbol
と String
で値が違うなんてことに。。。
new_params = { email: 'test@test.com' }.merge(params)
new_params[:email]
=> "test@test.com"
new_params['email']
=> "sample@example.com"
with_indifferent_access
を付けることで、同じ動きを維持できます。
new_params = { email: 'test@test.com' }.with_indifferent_access.merge(params)
new_params[:email]
=> "test@test.com"
new_params['email']
=> "test@test.com"
Exception
なのか nil
なのか
Ruby ではエラーになった場合、Exception
を出すパターンと nil
を返すパターンがあり、メソッドによって異なります。
特に、似たようなメソッドなのに違う動きをする場合もあるので、注意が必要です。
Time.parse
, Time.zone.parse
の引数エラー
Time.parse('hoge')
ArgumentError: no time information in "hoge"
Time.zone.parse('hoge')
=> nil
Time
と Time.zone
同じメソッドが用意されているので、使い勝手も同じかと思いきや、違うことがあるので、注意が必要ですね。
Integer
と to_i
の引数エラー
Integer('hoge')
ArgumentError: invalid value for Integer(): "hoge"
'hoge'.to_i
=> 0
正直、to_i
で 0
が返ってくるのは、使いにくくないかい ?
"!" が付いてないのに破壊的なやつがいる
Ruby では破壊的メソッドの後には "!" が付いてるよ、と習いませんでしたか ?
map!
とか sort!
とか
自分でメソッド作る時も、"!" つけることで、使うときは注意してね、って分かりやすい。
ですが、全てに "!" がついているわけではないんですよ。。。
keep_if
, delete_if
は破壊的
Array
と Hash
にある keep_if
, delete_if
メソッドは呼び出したオブジェクト自身が変更されます。
num_list = [1, 2, 3, 4, 5] #=> [1, 2, 3, 4, 5]
odd = num_list.keep_if {|num| num.odd?} #=> [1, 3, 5]
even = num_list.delete_if {|num| num.odd?} #=> []
num_list #=> []
まー、名前から見ても、分かりそうですし、
delete_if
= reject!
、keep_if
= filter!
なんですけど。
結論
何となくで実装せず、ちゃんと仕様を確認しよう。