2016-03-24 6 views
5

Рассмотрим следующий код:Как отменить логическое в трубопроводе?

defmodule T do 
    def does_not_contain?(s, t) do 
    s |> not(String.contains?(t)) 
    end 
end 

Это дает следующее сообщение об ошибке при компиляции

** (CompileError) iex:3: undefined function not/2 

Я также попытался конструкцию так:

defmodule T do 
    def does_not_contain?(s, t) do 
    s |> String.contains?(t) |> not 
    end 
end 

Это дает мне эту ошибку:

** (SyntaxError) iex:4: unexpected token: end 

я могу сделать что-то вроде этого, который работает:

defmodule T do 
    def does_not_contain?(s, t) do 
    does_contain = s |> String.contains?(t) 
    not(does_contain) 
    end 
end 

Но это весьма привлекательным, чтобы попытаться сохранить все это в трубопроводе. Есть ли способ свести на нет логическое значение в конвейере?

ответ

13

Если вы используете полностью квалифицированную версию функции, то вы можете использовать его в трубопроводе:

iex(1)> true |> Kernel.! 
false 
iex(2)> true |> Kernel.not 
false 
+1

Спасибо! Это именно то, что я искал! –

Смежные вопросы