cf. 19 シギル(印) – Sigils – Elixir
シギルとは ~
+一文字から始まる文字表現によってデータを記述するものだ。Ruby の % 記法みたいなもの。
正規表現
最もよく使うのは正規表現だ。正規表現のシギルは ~r
で始まる。
iex(1)> re = ~r/foo|bar/ ~r/foo|bar/ iex(2)> "foo" =~ re true iex(3)> "baz" =~ re false
~r
の後にセパレータ(ここでは /
)が続いて、セパレータに挟まれた形で正規表現(の文字列)が来る。
セパレータ
上の例ではセパレータに /
を使ったけど、Elixir では全部で8つのセパレータをサポートしている。
- //
- ||
- “”
- ”
- ()
- []
- {}
- <>
内容に応じて使いやすいセパレータを使えばいい。
文字列、文字リスト、単語リスト
~s
シギルは文字列を生成する。
iex(4)> ~s(hello) "hello"
~c
は文字リスト。
iex(5)> ~c(hello) 'hello'
そして ~w
は単語のリストを生成する。これは Ruby の %w
と同じだ。
iex(6)> ~w(foo bar baz) ["foo", "bar", "baz"]
カスタムシギル
Elixir の目標の一つに拡張性がある。シギルも拡張できる。どういうことかというと、標準では提供されていないシギルを自分で定義できるってこと。
初めに例を挙げた ~r は実際には sigil_r 関数の呼び出しになっている。
iex(7)> sigil_r(<<"foo">>, '') ~r/foo/
だから sigil_ナントカ
という関数を定義すればシギルを定義したことになる。例えば整数を返す ~i
を定義してみよう。
iex(8)> defmodule MySigils do ...(8)> def sigil_i(string, []), do: String.to_integer(string) ...(8)> end {:module, MySigils, <<70, 79, 82, 49, 0, 0, 5, 4, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 172, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:sigil_i, 2}} iex(9)> import MySigils MySigils iex(10)> ~i<42> 42
なるほど、期待した通りに動いている。
ところで sigil って、Perl のシジルと同じスペルなんだけど、どっちの発音が正しい(というか原語に近い)んだろうか。