【问题标题】:Elixir, default keyword list argumentElixir,默认关键字列表参数
【发布时间】:2016-05-15 17:45:08
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: promise elixir default-arguments keyword-argument


    【解决方案1】:

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

    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 有很大不同的东西,除非你开始研究并发和消息传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多