我正在阅读Elixir 教程中关于印记的页面。
我希望定义印记的语法使用“defsigil”,就像“defstruct”、“defprotocol”等一样。
但事实并非如此。
为什么?
2 回答
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
最初的 sigil 语法是用于 sigil 的字符在def __s__
哪里s
(现在应该是def sigil_s
.)。您可以在开始处理 sigil 的初始提交中看到这一点。我相信这项工作是在宏实施之前开始的。
这种语法需要一个 hack 来允许它们被导入,你可以在这个 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
也许没有人建议它?这是我最好的猜测,因为在这篇文章的时候,在谷歌上搜索“defsigil”只会返回这个问题。如果在 GitHub 或 IRC 上提到它,那么搜索结果中就会提到它。