【发布时间】:2015-06-01 09:54:18
【问题描述】:
我正在阅读 page Elixir 教程中关于印记的内容。
我希望定义印记的语法使用“defsigil”,就像“defstruct”、“defprotocol”等等。
但事实并非如此。
为什么?
【问题讨论】:
-
这个问题似乎比这里更适合向 Elixir 核心维护者提问。投票结束。
我正在阅读 page Elixir 教程中关于印记的内容。
我希望定义印记的语法使用“defsigil”,就像“defstruct”、“defprotocol”等等。
但事实并非如此。
为什么?
【问题讨论】:
最初的印记语法是def __s__,其中s 是用于印记的字符(现在是def sigil_s。)您可以在开始研究印记的initial commit 中看到这一点。我相信这项工作是在宏实施之前开始的。
此语法需要 hack 才能导入它们,您可以在 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 上提到它,那么搜索结果中就会提到它。
【讨论】:
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
【讨论】:
defsigil 不存在是有“道德”原因的:印记会很快导致极其神秘的代码。 Elixir 提供了编写自定义印记的工具,但我认为只有在使用它们的好处很多时才应该使用它们。
defsigil u(string, _options) do string |> String.upcase end。