【问题标题】:Idiomatic Elixir - Function Parameter Style惯用的 Elixir - 函数参数样式
【发布时间】:2014-01-12 09:27:28
【问题描述】:

drawhand 变量是列表。我想将最上面的牌移出平局并将其添加到手牌中。这是函数:

def pick_up_card(draw, hand) do
  [new_card | new_draw ] = draw
  {hand ++ [new_card], new_draw}
end

可以通过包含 [head |参数列表中的tail]部分:

def pick_up_card([new_card | new_draw], hand) do
  {hand ++ [new_card], new_draw}
end

那会是更惯用的 Elixir 吗?它会损害可读性吗?我想如果函数定义具有传入列表的名称而不是 Head|Tail 调用,那么以后代码会更容易阅读。

这是个人喜好问题,还是我最好保存那行代码并将 Head|Tail 调用粘贴在函数定义中?

【问题讨论】:

  • new_card后面需要加hand吗?如果不是更有效地做{[new_card|hand], new_draw}。如果draw 不是列表,则您的两个替代结果会产生基本相同的代码,只是不同的错误。
  • 是的,为了实现这个功能,我将这张牌从 draw 列表中取出,并将其添加到 hand 列表中。 (不过,它是添加到 hand 列表的前面还是末尾并不重要。)在现实世界中,我正在捡起一张牌并将其添加到我的手上。
  • 如果您不在乎将其添加到hand 列表的哪个位置,那么罗伯特的建议会更好,因为添加到列表顶部是 O(1),同时添加到尾部是 O(n)。
  • 谢谢,莎莎。这是关于 O(1) 的一个很好的观点。基于这一点,我可能会重写的不仅仅是这个函数。谢谢!

标签: function parameters elixir


【解决方案1】:

在我看来,最好把它放在参数列表中。你可能想写另一个子句

def pick_up_card([], _), do: raise "Nothing to pick"

在不久的将来,不是吗? :) 或者关心其他特殊情况 - 所以最好从一开始就将它放在标题中。

【讨论】:

  • 对空列表的检查发生在我在示例中的步骤之前的步骤中。如果从绘图堆栈中没有任何东西可以拾取,那么实际上游戏结束了,程序会朝着不同的方向前进。
  • 所以这两个选项实际上是相同的,您可能会看到第二个示例更频繁。
  • 谢谢,何塞。那么,这是最有意义的。
猜你喜欢
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2018-02-09
  • 2018-08-16
  • 2015-05-01
  • 2013-06-01
相关资源
最近更新 更多