Elixir 自定义印记
2023-12-16 20:46 更新
正如本章开始时提到的,Elixir中的印记也具有扩展性.事实上,使用印记
~r/foo/i
相当于使用一个二进制数和一个字符列表作为参数调用sigil_r
:iex> sigil_r(<<"foo">>, 'i')
~r"foo"i
我们可以通过sigil_r
获取~r
印记的文档:
iex> h sigil_r
...
我们也可以简单地在sigil_{identifier}
模式之后添加需要实现的函数来自定义我们的印记.例如,让我们用~i
印记来返回一个整数(使用修饰符n
可以将其变为负数):
iex> defmodule MySigils do
...> def sigil_i(string, []), do: String.to_integer(string)
...> def sigil_i(string, [?n]), do: -String.to_integer(string)
...> end
iex> import MySigils
iex> ~i(13)
13
iex> ~i(42)n
-42
印记也可以在宏的帮助下进行编译时工作.例如,在编译源代码时,Elixir中的正则表达式会被编译成一个高效的表示方法,在运行时就可以跳过此步骤.如果你对此感兴趣,我们建议你学习宏的知识,并了解印记是如何在Kernel
模块中被实现的(sigil_*
函数就是在那里定义的).
以上内容是否对您有帮助:
更多建议: