长生不老药语法词后跟冒号和波浪箭头等

elixir syntax word followed by colon and squiggly arrow and more

更新问题见更新部分

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

这是 JavaScript 或 Python 中的 object/map 还是函数?

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()

波浪箭头有什么作用?

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

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

  • 键必须是原子
  • 允许重复键
  • 顺序被保留

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

Elixir 也有一个语法,其中 [key: value] 表示 [{:key, :value}] 并且在某些情况下还允许省略括号。

所以你的第一个例子和

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

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

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

Elixir 是可以省略括号的语言之一(如 Ruby),因此有时当您阅读代码时,您甚至可能没有意识到您正在查看带有参数的函数。 config 就是其中之一。具体来说,您正在查看 Config.config/2 and Config.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"}}]。 -- 更冗长的语法可能让人头晕目眩,所以您会明白为什么它经常被缩写。

你可以看到一个映射(它是 Elixir 等同于 Python 字典或 Ruby 散列):%{"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),和以前一样,它是一个关键字列表,经常省略可选括号。

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

有很棒的文档。因此,当您偶然发现类似的事情时,您可以打开一个 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来完全复制你文件中的环境。