promise - Elixir,默认关键字列表参数

标签 promise elixir default-arguments keyword-argument

在 elixir 中可以在函数定义中使用默认参数,但我发现使用单个关键字列表参数是不可能的,例如:

def do_stuff(
  success: sucess \\ fn(conn) -> conn end,
  error: error
) do
  # ...
end

此外,我考虑过使用类似 JS promises 的东西来避免这种“回调传递”编码风格,但我找不到 Elixir 的 promises 实现。

也许语言中内置了一些东西可以帮助我编写更好的代码并更接近 elixir 标准。

主要问题:是否可以使用默认关键字参数?

附带问题:Elixir 是否提供了一些东西来帮助避免这种“回调传递”编程风格,以支持更具 react 性/可组合性的机制?

最佳答案

不,不可能使用默认关键字参数,因为关键字参数只是单个关键字列表的语法糖:

do_stuff(success: ..., failure: ...)

相同
do_stuff([success: ..., failure: ...])

所以关键字列表实际上只是一个参数。您在函数定义中所做的是匹配传递给 do_stuff/1 的关键字列表:一定要注意这一点,因为您的函数定义将如果关键字的顺序不相同(即 do_stuff(failure: ..., success: ...)),则不匹配。

我认为克服这个问题的一个好方法是简单地为 do_stuff 函数使用两个不同的参数:

def do_stuff(success \\ fn(conn) -> conn end, failure \\ fn(err) -> err end)

这样默认参数就可以正常工作了。如果你真的需要你的参数是一个关键字列表,那么你可以在函数体内处理默认值:

def do_stuff(options) do
  success = options[:success] || (fn(conn) -> conn end)
  failure = options[:failure] || (fn(err) -> err end)
end

最后,关于您提到的“回调样式”,除非您开始研究并发性和消息通过。

关于promise - Elixir,默认关键字列表参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37241625/

相关文章:

c++ - 为什么具有默认分配参数的函数不被接受为 0-arg 生成器?

jquery - 递归 Ajax 延迟对象

node.js - 当/Node liftAll 不适用于 s3 对象

javascript - 如何在 React 中等待多个异步等待请求

node.js - 如何使用keytar(用于 Electron )

elixir - Phoenix 为 POST 返回 200 状态码

elixir - 我的申请开始了,但马上就结束了

elixir - 我可以在 Ecto 中使用其中一个关联的聚合计数来查询模型吗?

c++ - 使函数参数默认为周围范围

python - 如何处理 argparse 中缺少的参数?