Elixir,默认关键字列表参数

时间:2016-05-15 17:45:09

标签: promise elixir default-arguments keyword-argument

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

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

另外,我想通过使用JS承诺之类的东西来避免这种“回调传递”编码风格,但我找不到Elixir的承诺实现。

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

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

附带问题: Elixir是否提供了一些帮助避免这种“回调传递”编程风格而采用更具反应性/可组合性的机制?

1 个答案:

答案 0 :(得分:6)

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

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

最后,关于"回调风格"你提到过,除非你开始研究并发和消息传递,否则我不知道任何与传递fn的工作方式大不相同的事情。