我对学灵药很陌生。
作为起点,我希望实现小型命令行应用程序。我在iex中偶然发现了以下情况:
args = ["--form", "blah"]
OptionParser.parse(args, switches: [src: :string])我本以为{[],[],[form: "blah"]}会有结果的。
相反,我收到了{[form: "blah"],[],[]}
我是不是忽略了什么?
此外:
如果我指定args args=["--folm", "lolo"],那么结果就是我所期望的{[], [], [{"--folm", "lolo"}]}。
我认为switches:定义了有效的开关。而且,只要我没有定义form: :string,我就不会期望它被接受。form似乎有什么特别之处,我现在还不明白。
发布于 2017-05-03 10:43:32
我认为
switches:定义了有效的开关。而且,只要我没有定义form: :string,我就不会期望它被接受。form似乎有什么特别之处,我现在还不明白。
在“动态”模式下,将当前Erlang中以原子形式存在的名称解析为有效列表,而不存在的则放在错误列表中。这一点可以这样验证:
iex(1)> OptionParser.parse(["--form", "blah"], switches: [src: :string])
{[form: "blah"], [], []}
iex(2)> OptionParser.parse(["--folm", "blah"], switches: [src: :string])
{[], [], [{"--folm", "blah"}]}
iex(3)> :folm # Create this atom
:folm
iex(4)> OptionParser.parse(["--folm", "blah"], switches: [src: :string])
{[folm: "blah"], [], []}--form在第一次尝试中解析,因为在启动时,药剂在某个地方创建了该原子:
$ erl -noshell -eval 'io:format("~p", [binary_to_existing_atom(<<"form">>, utf8)]), init:stop().'
form这在OptionParser.parse/2的“解析动态开关”一节中有记录。
换句话说,在使用动态模式时,Elixir将做正确的事情,只解析运行时使用的选项,而忽略所有其他选项。如果您想解析所有的开关,不管它们是否存在,您可以通过传递allow_nonexistent_atoms: true作为选项来强制原子的创建。当您构建命令行应用程序时,该选项非常有用,这些应用程序接收动态命名的参数,但必须在长时间运行的系统上小心使用。
可以使用严格开关模式关闭此行为:
iex(5)> OptionParser.parse(["--form", "blah"], strict: [src: :string])
{[], ["blah"], [{"--form", nil}]}
iex(6)> OptionParser.parse(["--folm", "blah"], strict: [src: :string])
{[], ["blah"], [{"--folm", nil}]}
iex(7)> OptionParser.parse(["--form", "blah", "--src", "blah2"], strict: [src: :string])
{[src: "blah2"], ["blah"], [{"--form", nil}]}https://stackoverflow.com/questions/43756545
复制相似问题