Ruby/Ruby on Railsの便利メソッドの紹介

Ruby/Railsの便利メソッドの紹介

# はじめに

このドキュメントは、Rubyプログラミング言語における便利なメソッドやテクニックを紹介するものです。
Rubyのコードをより簡潔で読みやすく、効率的に書くためのヒントを提供します。各セクションでは、具体的なコード例とその実装のポイントを説明しています。

RubyやRailsを始めたばかりの頃に知っておきたかったこと、独自で実装したが実は既にメソッドとして存在していたことなど、初心者の方にぜひ知ってほしい内容をまとめています。よかったら参考程度にみてください〜 :raised_hands:

## 1. ifとunlessの使い分け

条件分岐を簡潔に書くために、`if`の代わりに`unless`を使うことができます。

```ruby
# ユーザーが管理者の場合、ダッシュボードを表示する
show_dashboard(user) if user.admin?
# ユーザーが管理者でない場合にリマインダーメールを送信する
send_reminder_email(user) unless user.admin?
```

### 実装のポイント

- `if`は条件が真の場合に実行され、`unless`は条件が偽の場合に実行されます。
- 簡潔に条件分岐を記述することで、コードの可読性を向上させます。

## 2. &:methodシンタックス

配列を順番に処理する際に、`&:method`を使うことでコードを短縮できます。

```ruby
names = users.map(&:name)
```

### 実装のポイント

- `&:method`シンタックスは、`map`や`select`などのメソッドで使うと、ブロックを省略して簡潔に記述できます。
- シンボルを使うことで、コードがより読みやすくなります。

## 3. safe navigation operator（&.）

オブジェクトが`nil`でない場合にメソッドを呼び出し、`nil`の場合は`nil`を返します。

```ruby
email = user&.profile&.email
```

### 実装のポイント

- `&.`演算子を使うことで、`nil`チェックを簡潔に行うことができます。
- ネストされたオブジェクトのプロパティにアクセスする際に、`nil`によるエラーを防ぐことができます。

## 4. presenceメソッド

オブジェクトが`nil`または空でない場合にそのオブジェクトを返し、そうでない場合は`nil`を返します。

```ruby
name = user.name.presence || "What's your name?"
```

### 実装のポイント

- `presence`メソッドは、オブジェクトが`nil`または空でないかを簡単にチェックできます。
- デフォルト値を設定する際に便利です。

## 5. Enumerable#tallyで要素の出現回数をカウント

配列内の要素の出現回数を簡単にカウントできます。

```ruby
fruits = ["apple", "banana", "apple", "orange", "banana", "apple"]
count = fruits.tally
# => { "apple" => 3, "banana" => 2, "orange" => 1 }
```

### 実装のポイント

- `tally`メソッドは、配列内の各要素の出現回数をカウントし、ハッシュとして返します。
- 簡潔に要素の頻度を把握することができます。

## 6. transform_valuesメソッドでハッシュの値を変換

ハッシュの値を一括で変換する場合に便利です。

```ruby
prices = { apple: 100, banana: 200 }
discounted_prices = prices.transform_values { |v| v * 0.9 }
# => { apple: 90.0, banana: 180.0 }
```

### 実装のポイント

- `transform_values`メソッドを使うと、ハッシュの各値に対して一括で処理を行うことができます。
- ブロック内で値を変換し、新しいハッシュを返します。

## 7. Array#differenceで配列の差を求める

2つの配列の差を求めることができます。

```ruby
a = [1, 2, 3, 4]
b = [3, 4, 5]
difference = a.difference(b)
# => [1, 2]
```

### 実装のポイント

- `difference`メソッドは、最初の配列から2番目の配列に含まれる要素を取り除いた新しい配列を返します。
- 配列の差を簡単に求めることができます。

## 8. digメソッドを使ったネストされたハッシュのアクセス

ネストされたハッシュから安全に値を取得するために、`dig`メソッドを使うことができます。これにより、存在しないキーにアクセスしようとしたときにエラーを防ぐことができます。

```ruby
user = { profile: { name: "Alice", age: 30 } }
name = user.dig(:profile, :name) # => "Alice"
non_existent = user.dig(:profile, :non_existent) # => nil
```

### 実装のポイント

- `dig`メソッドは、ネストされたハッシュや配列の中から安全に値を取得するために使います。
- 存在しないキーにアクセスしても`nil`を返すため、エラーを防ぐことができます。

## 9. Array#unionで配列の和を求める

2つの配列の和を求めることができます。

```ruby
a = [1, 2, 3]
b = [3, 4, 5]
union = a.union(b)
# => [1, 2, 3, 4, 5]
```

### 実装のポイント

- `union`メソッドは、2つの配列を結合し、重複を取り除いた新しい配列を返します。
- 配列の和を求める際に便利です。

## 10. Array#intersectionで配列の共通部分を求める

2つの配列の共通部分を求めることができます。

```ruby
a = [1, 2, 3]
b = [3, 4, 5]
intersection = a.intersection(b)
# => [3]
```

### 実装のポイント

- `intersection`メソッドは、2つの配列の共通要素を含む新しい配列を返します。
- 配列の共通部分を簡単に求めることができます。

## 11. Kernel#thenでメソッドチェーンを簡潔に

`then`メソッドを使うことで、メソッドチェーンをより簡潔に記述できます。

```ruby
result = [1, 2, 3].map { |n| n * 2 }.then { |arr| arr.sum }
# => 12
```

### 実装のポイント

- `then`メソッドは、オブジェクトに対して次の処理をチェーンする際に使います。
- メソッドチェーンをより読みやすく、簡潔に記述できます。