首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >灵丹妙药OptionParser接受[--表格“,"blah"]

灵丹妙药OptionParser接受[--表格“,"blah"]
EN

Stack Overflow用户
提问于 2017-05-03 09:45:07
回答 1查看 201关注 0票数 0

我对学灵药很陌生。

作为起点,我希望实现小型命令行应用程序。我在iex中偶然发现了以下情况:

代码语言:javascript
复制
args = ["--form", "blah"]
OptionParser.parse(args, switches: [src: :string])

我本以为{[],[],[form: "blah"]}会有结果的。

相反,我收到了{[form: "blah"],[],[]}

我是不是忽略了什么?

此外:

如果我指定args args=["--folm", "lolo"],那么结果就是我所期望的{[], [], [{"--folm", "lolo"}]}

我认为switches:定义了有效的开关。而且,只要我没有定义form: :string,我就不会期望它被接受。form似乎有什么特别之处,我现在还不明白。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-03 10:43:32

我认为switches:定义了有效的开关。而且,只要我没有定义form: :string,我就不会期望它被接受。form似乎有什么特别之处,我现在还不明白。

在“动态”模式下,将当前Erlang中以原子形式存在的名称解析为有效列表,而不存在的则放在错误列表中。这一点可以这样验证:

代码语言:javascript
复制
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在第一次尝试中解析,因为在启动时,药剂在某个地方创建了该原子:

代码语言:javascript
复制
$ erl -noshell -eval 'io:format("~p", [binary_to_existing_atom(<<"form">>, utf8)]), init:stop().'
form

这在OptionParser.parse/2的“解析动态开关”一节中有记录。

换句话说,在使用动态模式时,Elixir将做正确的事情,只解析运行时使用的选项,而忽略所有其他选项。如果您想解析所有的开关,不管它们是否存在,您可以通过传递allow_nonexistent_atoms: true作为选项来强制原子的创建。当您构建命令行应用程序时,该选项非常有用,这些应用程序接收动态命名的参数,但必须在长时间运行的系统上小心使用。

可以使用严格开关模式关闭此行为:

代码语言:javascript
复制
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}]}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43756545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档