0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Elixir Sigils

Last updated at Posted at 2014-10-16

Elixir Sigils

概要

Elixir の Sigils について。

Sigil: 印, 印鑑, 魔力を持つしるし.

Elixir の文字列表現には、ダブルクォートやシングルクォートの文字リスト表現などがありますが、
もう一つの表現方法として Sigils があります。

Elixir のゴールの一つは ドメインに特化した記述が柔軟にできるような拡張性を持つことです。

※Rubyに詳しい方は %記法 の文法に近い話だと思えばいいです

Siglis

基本的な文法は、チルダ+1文字+セパレータです。
例えば、正規表現は チルダ+r+セパレータです。

iex> hogex = ~r/h.ge/
~r/h.ge/
iex> "hoge" =~ hogex
true
iex> "hige" =~ hogex
true
iex> "hage" =~ hogex
true
iex> "hagee" =~ hogex
true
iex> "hag" =~ hogex
false

セパレータは、他の言語の正規表現で一般的であるスラッシュを利用しているが、
全部で8種類の記述方法がある。

~r/h.ge/
~r|h.ge|
~r"h.ge"
~r'h.ge'
~r(h.ge)
~r[h.ge]
~r{h.ge}
~r<h.ge>

文字列(ダブルクォート代替)

~s / ~S でダブルクォートを代替します。
小文字はエスケープ・変数展開可、大文字はエスケープ・変数展開不可。

iex> var = "@@@"
"@@@"
iex> ~s(hoge hige hage) |> String.upcase
"HOGE HIGE HAGE"
iex> ~s(hoge hige hage #{var}) |> String.upcase
"HOGE HIGE HAGE @@@"
iex> ~S(hoge hige hage #{var}) |> String.upcase
"HOGE HIGE HAGE \#{VAR}"

文字列(シングルクォート代替)

~c / ~C でシングルクォートを代替します。
小文字はエスケープ・変数展開可、大文字はエスケープ・変数展開不可。

iex> var = "@@@"
"@@@"
iex> ~c(hoge hige hage) |> Enum.take(6)
'hoge h'
iex> ~c(#{var} hoge hige hage) |> Enum.take(6)
'@@@ ho
iex> ~C(#{var} hoge hige hage) |> Enum.take(6)
'\#{var}'

文字列配列

~w で文字列配列を代替します。
小文字はエスケープ・変数展開可、大文字はエスケープ・変数展開不可。

modifier として
s : ダブルクォート
c : シングルクォート
a : Atom
がある。
デフォルトはダブルクォーオトです。
modifier の大文字小文字については既出のルールと同じ

iex> 
iex> ~w(hoge hige hage) |> Enum.take(2)
["hoge", "hige"]
iex> ~w(hoge hige hage)s |> Enum.take(2)
["hoge", "hige"]
iex> ~w(hoge hige hage)s |> Enum.take(2)
["hoge", "hige"]
iex> ~w(hoge hige hage)c |> Enum.take(2)
['hoge', 'hige']
iex> ~w(hoge hige hage)a |> Enum.take(2)
[:hoge, :hige]

ヒアドキュメント

iex> var = "@@@"
"@@@"
iex> ~s"""
...> line1
...> #{var}
...> line3
...> """
"line1\n@@@\nline3\n"

iex> var = "@@@"
"@@@"
iex> ~S"""
...> line1
...> #{var}
...> line3
...> """
"line1\n\#{var}\nline3\n"

iex> var = "@@@"
"@@@"
iex> chars = ~c"""
...> line1
...> #{var}
...> line3
...> """
'line1\n@@@\nline3\n'
iex> chars |> Enum.take(10)
'line1\n@@@\n'

カスタム Sigil

  • sigil_r
    Sigil を呼び出すのと同等のことができます
iex> regexp = sigil_r(<<"h.ge">>, 'i')
~r/h.ge/i
iex> "hoge"=~regexp
true
iex> "hge"=~regexp
false
  • custom sigit
iex> defmodule UpDownSigils do
...>   def sigil_u(string, []), do: String.upcase(string)
...>   def sigil_d(string, []), do: String.downcase(string)
...> end
{:module, UpDownSigils,
 <<70, 79, 82, 49, 0, 0, 5, 152, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 213, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 2, 104, 2, ...>>,
 {:sigil_d, 2}}
iex> import UpDownSigils
nil
iex> ~u(hOgE)
"HOGE"
iex> ~d(hOgE)
"hoge"

参照

http://elixir-lang.org/docs/stable/elixir/Regex.html
http://elixir-lang.org/getting_started/19.html

0
1
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?