Elixir 1.17で新たに闘魂注入されたto_timeout/1を解説します

```elixir
defmodule FightingSpirit do
  def shout do
    IO.puts "元氣ですかーーーッ！！！"
    IO.puts "元氣があればなんでもできる！"
    IO.puts "闘魂とは己に打ち克つこと。"
    IO.puts "そして闘いを通じて己の魂を磨いていく"
    IO.puts "ことだと思います。"
  end
end

FightingSpirit.shout()
```

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います。}$</font></b>

![DALL·E 2024-11-04 00.25.15 - .jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/d3578b8e-65f3-ab36-4d1b-a64a2fa35aee.jpeg)



# はじめに

[Elixir](https://elixir-lang.org/) 1.17で追加された [Kernel.to_timeout/1](https://hexdocs.pm/elixir/Kernel.html#to_timeout/1) 関数を紹介します。

まずは、この記事でその魅力を最大限に体感していただきましょう！
この記事を読めば迷うことなく、`to_timeout/1`を使えるようになります。

---

# `to_timeout/1`とは？

`to_timeout/1` 関数は、与えられたキーワードリスト、[Duration](https://hexdocs.pm/elixir/Duration.html)構造体、タイムアウト値からミリ秒を返す関数です。

たとえば、[Process.send_after/3](https://hexdocs.pm/elixir/Process.html#send_after/4)の第3引数で使います。

```elixir
Process.send_after(pid, :wake_up, to_timeout(hour: 123))
```

これまでは123時間をミリ秒で表す `123 * 60 * 60 * 1000` や `442800000` と書いていました。これからは `to_timeout/1` を使いましょう！！！

別の言い方をElixir流にすると以下のパターンマッチが成立します。

```elixir
442800000 = to_timeout(hour: 123)
```

# 具体的な使い方

具体的な使い方を示します。

## キーワードリスト

`to_timeout/1` は、以下の単位をキーワードで指定できます：

- **ミリ秒 (`:millisecond`)**
- **秒 (`:second`)**
- **分 (`:minute`)**
- **時間 (`:hour`)**
- **日 (`:day`)**
- **週 (`:week`)**

### 使用例

例えば、5分のミリ秒を得たい時：

```elixir
to_timeout(minute: 123) # => 7380000
```

これは、`7380000`を返します。いままでのように`123 * 60 * 1000`をコーディングする必要はありません。

## Duration

Duration構造体を指定できます。

### 使用例

Duration構造体を指定した例です。

```elixir
to_timeout(%Duration{day: 1, hour: 2, minute: 3}) # => 93780000
```

## タイムアウト値

タイムアウト値を数値で指定することもできます。そのまま返ってきます。 `:infinity`の指定も可能です。

### 使用例

タイムアウト値を指定した例です。

```elixir
to_timeout(123) # => 123

to_timeout(:infinity) # => :infinity
```

---


# `to_timeout/1` のメリット

- **コードの可読性が向上**  
  直感的な時間指定により、コードの意図が即座に理解可能です。従来のように `123 * 60 * 1000` とコーディングする負担に苦しむことがありません。

- **ミスの軽減**  
  手動の計算はバグを生む温床です。しかし、このシンプルな書き方により、エラーの原因を排除できます。己のエラーに打ち克つ、まさに「闘魂」の体現です。

- **一貫性を保つ**  
  他のタイムアウト値設定とも一貫性をもって実装でき、プロジェクト全体が読みやすくなります。

---

# どうやって実行するんだー！？　バカヤロー！って方へ

GitHubのアカウントをお持ちの方へお手軽な方法を示しておきます。
[PhoenixアプリケーションをGitHub Codespaces上で開発する方法](https://qiita.com/torifukukaiou/items/5dd716cb04db9b46bc92)で紹介した[GitHub Codespaces](https://github.co.jp/features/codespaces)を使うという方法です。

https://qiita.com/torifukukaiou/items/5dd716cb04db9b46bc92

記事中で紹介している[phx_devcontainer](https://github.com/TORIFUKUKaiou/phx_devcontainer)を使うと、ElixirがインストールされたUbuntuコンテナが立ち上がるので、Ubuntu上で直接開発をしているかのように操作ができます。`iex`コマンドでREPL(Read-Eval-Print Loop)が立ち上がるのでこの記事のコード例をぜひ試してください。

![スクリーンショット 2024-11-02 14.11.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/303ee996-0b65-30c9-9b75-08d297b96f7a.png)

---

# まとめ

`Kernel.to_timeout/1` は、Elixir 1.17における闘魂の新機能です。「迷わず行けよ、行けばわかるさ！」の精神で、時間設定を驚くほど簡潔にし、読みやすいコードを実現する強力な武器となるでしょう。

<b><font color="red">$\huge{迷わず使えよ　使えばわかるさ！}$</font></b>  
Elixir 1.17 の `to_timeout/1` を活用し、開発を加速させましょう！