【问题标题】:elixir syntax word followed by colon and squiggly arrow and more长生不老药句法词后跟冒号和波浪形箭头等
【发布时间】:2021-01-01 07:11:37
【问题描述】:

有关更新的问题,请参阅更新部分

需要一些帮助来了解 Elixir 中的内容。

这是 JavaScript 或 Python 中的对象/映射还是函数?

config :some_api,
  something: %{
    "user" => "xxx",
    "name" => "xxx"
  }

config :someStr, Some.Module.Repo, parameters: [somestring: "${USER}-some-str"]

更新

我正在浏览 Elixir 文档,但无法真正找到对这些语法的引用。

1)

def myFunc() do
[
 {Some.Module, someParam: 1},
 {SomeDef, [someParam: someData]}
]

我猜当这个函数被调用时,它会按顺序执行列表中的所有操作?

2)

def someFunc() do
 |>someFunc()
 ~> someModule.func()

波浪形箭头有什么作用?

【问题讨论】:

  • 关于“波浪形箭头”(又名operator)的问题应该是它自己的问题。

标签: elixir


【解决方案1】:

Elixir 是可以省略括号的语言之一(如 Ruby),因此有时当您阅读代码时,您甚至可能没有意识到您正在查看一个带参数的函数。 config 就是其中一种情况。具体来说,您正在查看Config.config/2Config.config/3

第一个config声明:

config :some_api,
  something: %{
    "user" => "xxx",
    "name" => "xxx"
  }

其实可以改写为:

config(:some_api, something: %{"user" => "xxx", "name" => "xxx"})

第二个参数是选项,这是 Elixir 中的常见约定,类似于 Python 中的关键字参数。和带有可选括号的函数一样,Elixir 中的关键字列表也有可选的括号,所以第二个参数可以写成[something: %{"user" => "xxx", "name" => "xxx"}],或者为了让它更长的形式,你可以写成[{:something, %{"user" => "xxx", "name" => "xxx"}}]。 -- 更冗长的语法可能有点让人头疼,所以你可以看到为什么它经常被缩写。

你可以看到一个映射(它是 Python 字典或 Ruby 哈希的 Elixir 等价物):%{"user" => "xxx", "name" => "xxx"}——这里的技巧是当键是字符串时,它们必须被引用并且你必须使用胖箭头=>。如果键是原子,您可以使用缩写语法:%{user: "xxx", name: "xxx"}

第二个配置示例使用config/3,因此:

config :someStr, Some.Module.Repo, parameters: [somestring: "${USER}-some-str"]

可以用括号重写为:

config(:someStr, Some.Module.Repo, [parameters: [somestring: "${USER}-some-str"]])

最后一个参数经常用于可选参数(按约定命名为opts),和以前一样,它是一个经常省略可选括号的关键字列表。

希望这能消除混乱;语法有一些陷阱,但在事情开始变得有意义之前不会太多。

【讨论】:

    【解决方案2】:

    Elixir 有所谓的keyword lists,它是 2 元素元组的列表,其中第一个元素,即键,是一个原子。

    我倾向于将关键字列表视为具有 3 个不同的地图:

    • 键必须是原子
    • 允许重复键
    • 订单被保留

    在处理较大的集合时,地图也会提供更快的查找,但我不知道我是否见过足够大的关键字列表以提高地图的效率。

    Elixir 还具有 [key: value] 表示 [{:key, :value}] 的语法,并且还允许在多种情况下省略括号。

    所以你的第一个例子是一样的

    config :some_api, [{:something, %{"user" => "xxx", "name" => "xxx"}}]
    

    您最常看到带有函数选项的括号省略。像这样:

    IO.inspect(term, label: "some label")
    

    【讨论】:

      【解决方案3】:

      有很好的文档。因此,当您偶然发现这件事时,您可能会打开一个iex 会话并在那里提出您的疑问。

      ❯ iex -S mix
      Erlang/OTP 23 [erts-11.1.3] [...]
      Interactive Elixir (1.11.2) [...]
      
      iex|1 ▶ import Mix.Config
      #⇒ Mix.Config
      
      iex|2 ▶ h config
      
      # a ton of information
      

      注意:我盲目地调用import Mix.Config 来完全复制您在文件中的环境。

      【讨论】:

        猜你喜欢
        • 2016-02-01
        • 1970-01-01
        • 2016-01-08
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多