たれをかも知る人にせむ高砂の松も昔の友ならなくに
Advent Calendar 2022 84日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
今日は、Integer.parse/2とFloat.parse/1を楽しんでみます。
動機
Integer.parse/2とFloat.parse/1を紹介しようとおもった動機です。
-
elixir.jp Slackの
#beginners
チャンネルの質問投稿で見かけました - 改めて興味深い関数だとおもいました
- Advent Calendar 2022 goes behind 8 days.
Integer.parse/2
公式の説明をそのまま掲載します。
Specs
parse(binary(), 2..36) :: {integer(), remainder_of_binary :: binary()} | :error
引数を2つ取ります。
- 第1引数は、文字列です
- 第2引数は、何進数なのかを指定します
- 第2引数を指定しない場合はデフォルトで10進数として評価されます
- 2進数から36進数までを指定できます
戻り値は、2種類あります。
- 変換に成功した場合は2要素のタプルです
- 最初の要素は変換した整数です
- 2番目の要素は変換できなかった文字列です
- 変換に失敗した場合は
:error
アトムです
Examples
公式に書いてあるExamplesをそのまま掲載しておきます。
iex> Integer.parse("34")
{34, ""}
iex> Integer.parse("34.5")
{34, ".5"}
iex> Integer.parse("three")
:error
iex> Integer.parse("34", 10)
{34, ""}
iex> Integer.parse("f4", 16)
{244, ""}
iex> Integer.parse("Awww++", 36)
{509216, "++"}
iex> Integer.parse("fab", 10)
:error
iex> Integer.parse("a2", 38)
** (ArgumentError) invalid base 38
使い方はこれでばっちりですね
実装
このあたりです。
ドキュメント中の</>
が押せますので気になる方は迷わず押してみましょう。
リンク先のソースコードの解説はいたしますまい。
以下の箇所には高い芸術性を感じます。
digits = [{?0..?9, -?0}, {?A..?Z, 10 - ?A}, {?a..?z, 10 - ?a}]
for {chars, diff} <- digits,
char <- chars do
digit = char + diff
defp count_digits_nosign(<<unquote(char), rest::bits>>, base, count)
when base > unquote(digit) do
count_digits_nosign(rest, base, count + 1)
end
end
Float.parse/1
公式の説明をそのまま掲載します。
Specs
https://hexdocs.pm/elixir/Float.html#parse/1
引数を1つ取ります。
戻り値は、2種類あります。
- 変換に成功した場合は2要素のタプルです
- 最初の要素は変換したfloatです
- 2番目の要素は変換できなかった文字列です
- 変換に失敗した場合は
:error
アトムです
Examples
公式に書いてあるExamplesをそのまま掲載しておきます。
iex> Float.parse("34")
{34.0, ""}
iex> Float.parse("34.25")
{34.25, ""}
iex> Float.parse("56.5xyz")
{56.5, "xyz"}
iex> Float.parse("pi")
:error
使い方はこれでばっちりですね
実装
このあたりです。
ドキュメント中の</>
が押せますので気になる方は迷わず押してみましょう。
リンク先のソースコードの解説はいたしますまい。
Wrapping up
Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$
本日は、以下をご紹介しました。
私はドキュメント中の Specs (例: parse(binary(), 2..36) :: {integer(), remainder_of_binary :: binary()} | :error
) を見てみぬふりをしてきました。
Examples
と照らし合わせながらみることでうっすら見えるようになった気がしてきました。
観の目強く、見の目弱く
以上です。