defmodule My do
def go do
x = nil
if (not x) do
IO.puts "hello"
else
IO.puts "goodbye"
end
end
end
В iex:
/elixir_programs$ iex c.exs
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> My.go
** (ArgumentError) argument error
c.exs:5: My.go/0
iex(1)>
Согласно Programming Elixir >= 1.6, стр.35:
Elixir has three special values related to Boolean operations: true, false, and nil. nil is treated as false in Boolean contexts.
Кажется, это неправда:
defmodule My do
def go do
x = false
if (not x) do
IO.puts "hello"
else
IO.puts "goodbye"
end
end
end
В iex:
~/elixir_programs$ iex c.exs
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> My.go
hello
:ok
iex(2)>





@spec not true :: false
@spec not false :: true
def not value do
:erlang.not(value)
end
Последнее определение функции not в Elixir показывает, что он принимает только false и true.
Однако nil им не принадлежит, поэтому показывает argument error.
Elixir has three special values related to Boolean operations: true, false, and nil. nil is treated as false in Boolean contexts.
nil - это просто atom, то есть nil === :nil.
Вы можете рассмотреть возможность использования оператора !, который на самом деле является макросом Kernel.!.
Receives any argument (not just booleans) and returns
trueif the argument isfalseornil; returnsfalseotherwise.
!nil вернет true.
"Kernel.not / 1" или нет / 1 ожидает логическое значение
note: Other values different of
nilandfalsearetrue
попробуйте этот пример:
x = nil
if (x) do true else false end
false
Примеры с условием short-if и значениями true, false, nil
iex> if nil , do: true, else: false
false
iex> if !nil , do: true, else: false
true
iex> if false , do: true, else: false
false
iex> if !false , do: true, else: false
true
iex> if not false , do: true, else: false
true
iex> if true , do: true, else: false
true
iex> if !true , do: true, else: false
false
iex> if not true , do: true, else: false
false
Вы пробовали переключиться на cond и посмотреть, компилируется ли он? Или переключение операторов на if x do IO. Вводит «до свидания», иначе IO. Вводит «привет»