如何管道if?

时间:2017-10-26 18:19:49

标签: elixir

我正在尝试解码websocket响应。如果它包含键'符号',我想打印出来。

我做到了这一点:

msg                                                                                                                                   
|>Poison.decode!                                                                                                                      
|>Enum.member?("symbol")                                                                                                              
|>if                                             
|>IO.inspect

不出所料,它不喜欢我的'if'。是否有实现这一目标的管道方式?

3 个答案:

答案 0 :(得分:3)

可悲的是,你无法做到,因为You can't pipeline into macros! 要实现您的需要,只需将此if放入正确的函数中即可。或者甚至更好 - 由于模式匹配,您可以使用不同的函数头进行条件分支!

Enum.member/2将返回true或false,因此您只需要:

defp processing_the_response(true) do
  # something
end

defp processing_the_response(false) do
  # something ELSE
end

答案 1 :(得分:1)

Kernel.if/2定义为2.在你的管道中你用arity为1来调用它。这意味着Kernel.if/1没有匹配。

另外,您的if应该返回IO.inspect来检查

的内容
[true, false] 
|> Enum.random() 
|> if(do: 42, else: "You can't handle the truth") 
|> IO.inspect

或者

[true, false]
|> Enum.random()
|> if do
        42
      else
        "You can't handle the truth"
      end
|> IO.inspect

或者如果您希望返回表达式本身的结果

["My random data", nil] 
|> Enum.random() 
|> (fn item -> if(item, do: item, else: "Sorry... no data!") end).() 
|> IO.inspect

甚至更好

value
|> something(42)
|> something_else()
|> case do
     page where limit_size == nil -> page
     page -> page |> limit(size)
   end
|> some_more_things()

最后一个例子取自elixir forum

如果您不想通过管道进行管道并偶尔打印,如果有特定的密钥,这里有一种方法

[a: 1, b: 3, c: 15]
|> (fn enumerable -> if(a = Access.get(enumerable, :a), do: IO.inspect(a, label: "The :a")); enumerable end ).()
|> (fn enumerable -> if(f = Access.get(enumerable, :f), do: IO.inspect(f, label: "This shouldn't be printed")); enumerable end ).()
|> IO.inspect(label: "The enumerable")

最好的方法是使用多头功能。

答案 2 :(得分:0)

您的回复实际上是列表还是地图?因为Enum.member?不能在地图上工作。如果它是一个地图,你可以利用elixir为地图做的特殊模式匹配,以更容易的方式实现这一目标

def show_result(%{"symbol" => _value} = msg) do 
  IO.inspect(msg) 
end 

def show_result(msg) do 
   msg
end 

此代码中的结果:

msg                                                                                                                                   
|> Poison.decode!                                                                                                                      
|> show_result