defmodule FightingSpirit do
def shout do
IO.puts "元氣ですかーーーッ!!!"
IO.puts "元氣があればなんでもできる!"
IO.puts "闘魂とは己に打ち克つこと。"
IO.puts "そして闘いを通じて己の魂を磨いていく"
IO.puts "ことだと思います。"
end
end
FightingSpirit.shout()
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います。}$
はじめに
Elixir 1.17で追加された Kernel.to_timeout/1 関数を紹介します。
まずは、この記事でその魅力を最大限に体感していただきましょう!
この記事を読めば迷うことなく、to_timeout/1
を使えるようになります。
to_timeout/1
とは?
to_timeout/1
関数は、与えられたキーワードリスト、Duration構造体、タイムアウト値からミリ秒を返す関数です。
たとえば、Process.send_after/3の第3引数で使います。
Process.send_after(pid, :wake_up, to_timeout(hour: 123))
これまでは123時間をミリ秒で表す 123 * 60 * 60 * 1000
や 442800000
と書いていました。これからは to_timeout/1
を使いましょう!!!
別の言い方をElixir流にすると以下のパターンマッチが成立します。
442800000 = to_timeout(hour: 123)
具体的な使い方
具体的な使い方を示します。
キーワードリスト
to_timeout/1
は、以下の単位をキーワードで指定できます:
- ミリ秒 (
:millisecond
) - 秒 (
:second
) - 分 (
:minute
) - 時間 (
:hour
) - 日 (
:day
) - 週 (
:week
)
使用例
例えば、5分のミリ秒を得たい時:
to_timeout(minute: 123) # => 7380000
これは、7380000
を返します。いままでのように123 * 60 * 1000
をコーディングする必要はありません。
Duration
Duration構造体を指定できます。
使用例
Duration構造体を指定した例です。
to_timeout(%Duration{day: 1, hour: 2, minute: 3}) # => 93780000
タイムアウト値
タイムアウト値を数値で指定することもできます。そのまま返ってきます。 :infinity
の指定も可能です。
使用例
タイムアウト値を指定した例です。
to_timeout(123) # => 123
to_timeout(:infinity) # => :infinity
to_timeout/1
のメリット
-
コードの可読性が向上
直感的な時間指定により、コードの意図が即座に理解可能です。従来のように123 * 60 * 1000
とコーディングする負担に苦しむことがありません。 -
ミスの軽減
手動の計算はバグを生む温床です。しかし、このシンプルな書き方により、エラーの原因を排除できます。己のエラーに打ち克つ、まさに「闘魂」の体現です。 -
一貫性を保つ
他のタイムアウト値設定とも一貫性をもって実装でき、プロジェクト全体が読みやすくなります。
どうやって実行するんだー!? バカヤロー!って方へ
GitHubのアカウントをお持ちの方へお手軽な方法を示しておきます。
PhoenixアプリケーションをGitHub Codespaces上で開発する方法で紹介したGitHub Codespacesを使うという方法です。
記事中で紹介しているphx_devcontainerを使うと、ElixirがインストールされたUbuntuコンテナが立ち上がるので、Ubuntu上で直接開発をしているかのように操作ができます。iex
コマンドでREPL(Read-Eval-Print Loop)が立ち上がるのでこの記事のコード例をぜひ試してください。
まとめ
Kernel.to_timeout/1
は、Elixir 1.17における闘魂の新機能です。「迷わず行けよ、行けばわかるさ!」の精神で、時間設定を驚くほど簡潔にし、読みやすいコードを実現する強力な武器となるでしょう。
$\huge{迷わず使えよ 使えばわかるさ!}$
Elixir 1.17 の to_timeout/1
を活用し、開発を加速させましょう!