12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 3

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

Last updated at Posted at 2024-11-05
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{ことだと思います。}$

DALL·E 2024-11-04 00.25.15 - .jpg

はじめに

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 * 1000442800000 と書いていました。これからは 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)が立ち上がるのでこの記事のコード例をぜひ試してください。

スクリーンショット 2024-11-02 14.11.07.png


まとめ

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

$\huge{迷わず使えよ 使えばわかるさ!}$
Elixir 1.17 の to_timeout/1 を活用し、開発を加速させましょう!

12
0
1

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
12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?