Effective Rubyの勉強メモです。
Rubyではメソッドの引数の型を指定しないため、さまざまな引数が与えられます。
もし配列が引数に与えられることを想定して実装すると、引数に単一のオブジェクトやnilが送られてきた場合に困ってしまいます。
そこで、Arrayメソッドを使って引数のオブジェクトを配列化し、さまざまな種類の引数に対応していきたいと思います。
スポンサーリンク
Arrayメソッド
ややこしい話なのですが、クラスなどの定数は先頭大文字などの制約があるのに対し、メソッドは結構命名が自由なので先頭大文字のメソッドを定義することもできます。
Arrayメソッドは引数のオブジェクトを含むような配列を返すメソッドです。
Array("aa") #=> ["aa"] Array(nil) #=> [] Array([1, 2, 3]) #=> [1, 2, 3]
単一の文字列は要素が一つの配列になり、nilは空配列、配列はそのまま返却されます。
配列に変換するメソッドにはto_a
がありますが、Arrayメソッドは内部でto_a
またはto_ary
メソッドを呼び出し、引数のオブジェクトがto_a
,to_ary
メソッドに対応していなければそのオブジェクトを含む新しい配列を作って返します。
ほとんどの場合には、to_a
,to_ary
メソッドを呼び出すよりも便利です。
ハッシュに対して使う場合
しかし、ハッシュに対しては注意が必要で、Arrayメソッドに渡してしまうと元のハッシュの形が崩れてしまいます。
Array({name: "jon", age: 12}) #=> [[:name, "jon"], [:age, 12]]
変換した配列は元のハッシュの情報を完全に保持しており、Hashクラスの[]メソッドを使えば(Hash[[[:name, "jon"], [:age, 12]]]
)もとに戻すことができます。
しかし、一つのメソッドで単一のハッシュもハッシュの配列も受け付けたい場合にはArrayメソッドで変換された配列は要件を満たすことができません。
Array([{name: "jon", age: 13}, {name: "alice", age: 20}]) #2名のユーザの情報 Array({name: "jon", age: 13}) # 1名の情報だが、Arrayメソッドの返り値は要素が2の配列になってしまう。
このままだと、eachで1名ずつのデータを取りたいと思って実装したときに、想定した動きになりません。
Arrayは便利なメソッドですが、用途によってはハッシュを渡してはならないことに注意です。
参考
- Effective Ruby
本シリーズはこの本を勉強しながら進めています。
初心者には難しいと思いますが、知らなかったことばかりで面白いです!
- 作者: Peter J. Jones,arton,長尾高弘
- 出版社/メーカー: 翔泳社
- 発売日: 2015/01/09
- メディア: 大型本
- この商品を含むブログ (13件) を見る
- Ruby on Railsアプリケーションプログラミング
Ruby単体よりもRailsを使うためにRubyを勉強される方が多いようです。
1冊Railsのオススメ書籍を載せておきます。
Ruby on Rails 5アプリケーションプログラミング
- 作者: 山田祥寛
- 出版社/メーカー: 技術評論社
- 発売日: 2017/04/14
- メディア: 大型本
- この商品を含むブログを見る
- プロを目指す人のためのRuby入門
言語仕様から開発手法まで、幅広い話題が載っていて、これからRubyを始める方やほかの言語を学んでRubyを勉強したい方にお勧めです!
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る