webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

至れり尽くせりArrayメソッドで配列に簡単変換

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

本シリーズはこの本を勉強しながら進めています。

初心者には難しいと思いますが、知らなかったことばかりで面白いです!

Effective Ruby

Effective Ruby

  • Ruby on Railsアプリケーションプログラミング

Ruby単体よりもRailsを使うためにRubyを勉強される方が多いようです。

1冊Railsのオススメ書籍を載せておきます。

Ruby on Rails 5アプリケーションプログラミング

Ruby on Rails 5アプリケーションプログラミング

  • プロを目指す人のためのRuby入門

言語仕様から開発手法まで、幅広い話題が載っていて、これからRubyを始める方やほかの言語を学んでRubyを勉強したい方にお勧めです!