2016-08-02 3 views
2

Если у меня есть трубопровод, как это:Elixir: защиты от ошибок аргумента

"1" |> String.to_integer 

Как я могу защититься от него, если строка пуста (не ноль)?

"" |> String.to_integer 
** (ArgumentError) argument error 
:erlang.binary_to_integer("") 
+0

Где вы использовать этот трубопровод? – TheAnh

+0

Это консоль, но она находится в модуле Phoenix. –

ответ

4

Все зависит от контекста. Например, вы можете использовать значение по умолчанию и использовать его в своей частной функции.

defp convert_to_integer(my_string \\ 0) # if 0 is appropriate default value 
    String.to_integer(my_string) 
end 

Конечно, есть лучший способ - Integer.parse, который возвращает действительный кортеж, если все в порядке и :error если что-то не так. Просто соедините его с cond или case.

defp convert_to_integer(my_string) 
    result = Integer.parse(my_string) 

    case result do 
    {number, _} -> number 
    :error -> "it didn't work" # or anything  
    end 
end 
+0

Это здорово, спасибо большое. –

+1

Обратите внимание, что второй фрагмент успешно проанализирует целое число, за которым следует что-либо еще, например. 'convert_to_integer (" 123abc ") # => 123'. – Dogbert

1

соответствия Try шаблон для защиты этого:

def to_integer(string) when byte_size(string) == 0 do 
    # do_something_with_empty_string 
    IO.puts "empty" 
end 

def to_integer(string) do 
    # handle your case here 
    String.to_integer(string) 
end 

Iex:

iex(9)> Test.to_integer("") 
empty 
:ok 
iex(10)> Test.to_integer("2") 
2 
+0

Спасибо за подсказки. Я забыл, что вы можете перезаписать функции в Elixir. –

+2

'to_integer (string), когда byte_size (string) == 0' может быть просто' to_integer ("") '. – Dogbert

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