我在读关于西格利兹的页面教程。
我希望定义sigils的语法使用"defsigil“,就像"defstruct”、"defprotocol“等等。
但事实并非如此。
为什么?
发布于 2015-06-01 15:07:12
最初的sigil语法是def __s__,其中s是用于sigil的字符(现在是def sigil_s)。您可以在开始处理sigils的初始提交中看到这一点。我相信这项工作是在宏实现之前就开始的。
这个语法需要一个hack来允许导入它们,您可以在这个问题。中看到这些信息。
今天,当有人写%f"foo“时,它会翻译为f("foo",[])。这个建议是将翻译改为: sigil_f("foo",[])。 这一变化带来两个好处: ( 1)姓名更为明确; 2)它允许我们移除我们进口商的一次黑客攻击。今天,导入Hello带来了所有的函数,这些函数不以下划线开头,但它为sigils做了一个例外;
您可以在讨论中看到一些其他建议,如defmodule Sigil.s,但是最终选择了def sigil_s语法。
实现这些更改的实际提交是https://github.com/elixir-lang/elixir/commit/c6284557e792efd67f13f421b723a7a301bdbb93。
我不知道为什么不是defsigil,也许没人建议这么做?这是我最好的猜测,因为在写这篇文章的时候,在谷歌上搜索"defsigil“只会返回这个问题。如果在GitHub或IRC上提到它,那么搜索结果中就会提到它。
发布于 2015-06-01 10:25:18
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.testhttps://stackoverflow.com/questions/30570461
复制相似问题