6
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?

Elixirのチートシートを作ろう #19 シギルその2

Last updated at Posted at 2024-12-24

1. OverView

Sigilsの続き。本日は12/25ですねー。
これにて、アドベントカレンダーとしてのチートシート作りは終わりたいと思います。
いや、面白いのでどんどん作りますけどね。書き直したいところも出てきました。

昨日も書きましたが、シジル、ややっこしいけど理にかなってて、面白い仕組みですね。

2. まずは解説

2.1 文字列

先日の文字のリストと似てますね。~s 及び ~S シギルは文字列データを生成するのに使われます。
sとSの違いは、エスケープシーケンスを処理するか、ですね。

iex(39)> ~s/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir school"
iex(40)> ~S/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir \#{String.downcase \"SCHOOL\"}"

~Sの方は、#{}の中が評価されず、そのまま表示されております。

iex(41)> is_binary(~S/welcome to elixir #{String.downcase "SCHOOL"}/)
true

戻り値も文字列ですね。

2.2 単語のリスト

さて、スペースで区切られた文字列を、listで返してくれるシギル、それが~wと~Wです。
wとWの違いは、エスケープシーケンスを処理するか、ですね。

iex(47)> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]
iex(48)> ~W/i love #{'e'}lixir school/
["i", "love", "\#{'e'}lixir", "school"]

区切り文字はスペースから変更できなさそうですね。

2.3 NaiveDateTime

これ、日付をやる際に、飛ばします。
迂闊に例を出すと「 NaiveDateTime 構造体を直接作ることは避けるべきです」と書いてあるので、ちょっと警戒しております。

2.4 シギルを作る。

さて、シギルを作ってみましょう。
まー、オレオレシギルを作ってもダメでしょうが、ライブラリやフレームワークで見かけるかも知れません。
なので、今までの総合で、しっかりやりましょう。

まずは、ここのサンプル

defmodule MySigils do
  def sigil_u(string, []), do: String.upcase(string)
end

sigil_uを格納する為に、MySigilsと言うモジュールを定義しております。
sigil_uと言う関数を定義してますね。
関数本体が1行で済むなら、 do: を使ってより短くすることが出来るそうですよ!ググりました!自分のチートシート出て来たw

さて、次

iex(6)> import MySigils
MySigils
iex(7)> ~u/elixir school/
"ELIXIR SCHOOL"

importで、先ほど定義したモジュールをimportしております。
そして、見事、オリジナルシジルuで、~u/elixir school/が評価されました。

…待てよ?

2.5 シギルを作る…の蛇足

defmodule MySigilsもわかる、import MySigilsもわからんでもない。
では?それだけ?

どうやら、sigilは、~に続く一文字の関数を呼び出しているみたいです。

今回はsigil_uでしたね。では、試しに、存在しないシジルkでやってみましょう。

iex(8)> ~k/elixir school/
error: undefined function sigil_k/2 (there is no such import)
  iex:8

** (CompileError) cannot compile code (errors have been logged)

なので、import MySigilsして、sigil_u/2が呼びさせる様にしてやった様です。

え?/2?そういや、正規表現の時に、そう言えば後ろにオプション付けてましたね。
re = ~r/elixir/i <--このiね。

となると、やってみよう。

defmodule MySigils do
  def sigil_u(string, opt), do: String.upcase(~s/#{string} with #{opt}/)
end

インポートはしてくださいね。念の為

iex(2)> import MySigils
MySigils
iex(6)>  ~u/elixir school/opt
"ELIXIR SCHOOL WITH OPT"

をー、シギルのデリミタの後ろのオプションもちゃんと読んでますなー。

さて、こんなところで、ちょっとはmoduleとかimportの実例を示せたでしょうか?
そう思っていただけると、蛇足にした甲斐がありますw

シジルの種類 説明
~c 及び ~C シギルはそれぞれ文字のリストを生成します。
~Cは中のエスケープシーケンスを評価しません
iex(14)> ~c/2 + 7 = #{2 + 7}/
~c"2 + 7 = 9"
iex(15)> ~C/2 + 7 = #{2 + 7}/
~c"2 + 7 = #{2 + 7}"
~r 及び ~R ~r 及び ~R シギルはそれぞれ正規表現を生成します。rはエスケープシーケンスを解釈しますが、Rがエスケープシーケンスを解釈しません iex(31)> re = ~r/[Ee]lixir/
iex(32)> "Elixir" =~ re
true
~s 及び ~S シギルはそれぞれ文字列を生成します。
~sは中のエスケープシーケンスを評価しません
iex(39)> ~s/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir school"
iex(40)> ~S/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir #{String.downcase "SCHOOL"}"
~w 及び ~w スペースで区切られた文字列を、listで返します。~Wは中のエスケープシーケンスを評価しません iex(47)> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]
iex(48)> ~W/i love #{'e'}lixir school/
["i", "love", "#{'e'}lixir", "school"]
6
0
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
6
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?