我正在阅读Elixir教程中关于sigils的page
我期望定义sigils的语法使用“defsigil”就像“defstruct”,“defprotocol”等等。
但事实并非如此
为什么?
答案 0 :(得分:3)
Sigils只是调用特定方法的一种奇特方式。请查看Custom Sigils上的部分。基本上~x/things/options
与sigil_x(things, options)
相同。所以你可以这样写:
defmodule Thing do
def sigil_u(string, _options) do
string |> String.upcase
end
def test do
~u/bob/
end
end
IO.inspect Thing.test
答案 1 :(得分:3)
原始的sigil语法为def __s__
,其中s
是用于sigil的字符(现在为def sigil_s
。)您可以在initial commit中看到这一点。开始研究印记。我相信这项工作是在实施宏之前开始的。
这种语法需要黑客才允许导入它们,您可以在this issue.
中阅读今天,当有人写%f“foo”时,它转换为 f (“foo”,[])。此提议将翻译更改为:sigil_f(“foo”,[])。
这一改变带来两个好处:
1)名称更明确;
2)它允许我们删除进口商的黑客攻击。今天,import Hello带来了Hello的所有函数,这些函数不以下划线开头,但它对sigils有例外;
您可以在讨论中看到其他一些建议,例如defmodule Sigil.s
,但最终选择了def sigil_s
语法。
实现这些更改的实际提交是https://github.com/elixir-lang/elixir/commit/c6284557e792efd67f13f421b723a7a301bdbb93
我不确定为什么不是defsigil
或许没有人建议过它?这是我最好的猜测,因为在这篇文章发表时,在Google上搜索“defsigil”只会返回这个问题。如果在GitHub或IRC上提到它,那么在搜索结果中就会提到它。