首页 > 解决方案 > 使用管道与函数调用时的错误/混淆

问题描述

到目前为止,我尝试制作一个 pinochle 甲板

deck = for rank <- ['2','3','4','5','6','7','8','9','T','J','Q','K','A',], suit <- ['C','D','H','S'],  blackwhite <- ['B','W'],  do: %{suit: suit, rank: rank, blackwhite: blackwhite}
|> Enum.shuffle

然而,洗牌部分似乎洗牌了地图的内部,而不是地图本身。但是,当关闭管道时

Enum.shuffle(deck)

我得到了预期的结果。想知道它的原因,以及是否有更好的方法。

标签: elixir

解决方案


由于运算符优先级,这是预期的行为。|>/2是一个运算符,运算符在宏调用之前。基本上,管道与下面示例中的乘法运算符具有相同的优先级,这就是为什么它应用于映射,而不是for/1调用的结果。

for i <- [1, 2, 3], do: i * 2

要实现所需的功能,请使用括号。

deck =
  (for rank <- [...], suit <- [...],  blackwhite <- [...],
    do: %{suit: suit, rank: rank, blackwhite: blackwhite})
  |> Enum.shuffle

推荐阅读