27
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Ruby]firstとlastを使うメリット

Last updated at Posted at 2018-01-22

はじめに

Array#firstArray#last[0][-1]で代用できます。
ちなみに、[]sliceのaliasです。

arr = [0, 1, 2, 3, 4]

arr.first #=> 0
arr[0]    #=> 0

arr.last  #=> 4
arr[-1]   #=> 4

firstlast使わなくてもいいんじゃない?」って初心者のときは思ってました...

firstlastを使うメリットについて、調べたこと、感じたことについてまとめてみました。

firstとlastを使うメリット

&修飾が使えるためシンプルに書ける

&:メソッド名でメソッドを呼ぶprocがブロックに変換されます。
この記法を使えばmapをシンプルに書けます。

arr = [['zero', 0], ['one', 1], ['two', 2]]

arr.map { |e| e[0] }  #=> ["zero", "one", "two"]
# シンプルに書ける
arr.map(&:first)      #=> ["zero", "one", "two"]

arr.map { |e| e[-1] } #=> [0, 1, 2]
# シンプルに書ける
arr.map(&:last)       #=> [0, 1, 2]

ただし、この記法だと引数は与えられません。

Rubyの array.map(&:to_s) 記法を紐解く
[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか
を参考にしました。

レシーバがnilの場合は&.でエラーを回避できる

firstlastはメソッドであるため、レシーバがnilの場合でも、&.を使えばエラーを回避できます。
&.はSafe Navigation Operatorと呼ばれるもので、レシーバがnilならそのままnilを返します。
Ruby2.3から使えます。

nil[0]     #=> NoMethodError: undefined method `[]' for nil:NilClass
nil.first  #=> NoMethodError: undefined method `first' for nil:NilClass
nil&.first #=> nil

nil[-1]    #=> NoMethodError: undefined method `[]' for nil:NilClass
nil.last   #=> NoMethodError: undefined method `last' for nil:NilClass
nil&.last  #=> nil

Ruby の &. と #try の違い を参考にしました。

[]でも&.が使える

一応、[]でも&.を使うことはできます。実用性はないですが...

arr = [0, 1, 2, 3, 4]

arr[0]     #=> 0
# .と引数を使っても書ける
arr.[](0)  #=> 0

# &.を使う
arr&.[](0) #=> 0
nil&.[](0) #=> nil

引数を与える場合、直感的にわかりやすい

firstlastは引数で何個の要素を取るか指定できます。

  • first(n)とすれば、先頭からn個の要素を配列で返します。
  • last(n)とすれば、末尾からn個の要素を配列で返します。

同じことを[m, n]で再現できます。

  • first(n)[0, n]と同じ
  • last(n)[-1, n]と同じ

[0, n][-1, n]はわかりにくい気がします。慣れれば気にならないかも...

arr = [0, 1, 2, 3, 4]

# 先頭から数えて2つとる
arr.first(2) #=> [0, 1]
arr[0, 2]    #=> [0, 1]

# 末尾から数えて3つ取る
arr.last(3)  #=> [2, 3, 4]
arr[-1, 3]   #=> [2, 3, 4]

コーディング規約で望ましい書き方とされている

RuboCopのコーディング規約fitstlastについての規約があります。

配列の最初や最後にアクセスしたいときは、 [0]や[-1]よりfirstやlastを使いましょう。

こちらによると理由は、

コード内でリテラルを書き散らすと一括変更やリファクタリングが面倒になるので、リテラルはなるべく1箇所にまとめるのが常道です。

だそうです。

ただし、これはRuboCopの規約を一例としてを示しただけなので、他の規約に従っても問題ないです。

おわりに

間違っていることの指摘や、他にもメリットがあればコメントで教えていただけるとありがたいです。

27
23
2

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
27
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?