Почему если (не ноль) дает мне ArgumentError? - PullRequest
0 голосов
/ 03 декабря 2018
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 есть три специальных значения, относящихся к логическим операциям: true, falseи ноль.nil считается ложным в булевых контекстах.

Это не так:

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)> 

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

" Kernel.not / 1 " или нет / 1 ожидает логическое значение

примечание: другие значения, отличающиеся от nil и false, равны true

попробуйте этот пример:

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
0 голосов
/ 03 декабря 2018
  @spec not true :: false
  @spec not false :: true
  def not value do
    :erlang.not(value)
  end

Последнее определение Elixir функции not показывает, что он получает только false и true.

Однако nil не принадлежит им, поэтому он показывает argument error.

В Elixir есть три специальных значения, связанных с логическими операциями: true, false и nil.В логических контекстах nil считается ложным.

nil - это просто atom, то есть nil === :nil.

Вы можете использовать оператор !, которыйна самом деле это макрос Kernel.!.

Получает любой аргумент (не только логический) и возвращает true, если аргумент false или nil;возвращает false в противном случае.

!nil вернет true.

...