W Elixirze jak sprawdzić typ, taki jak w Pythonie:
>>> a = "test"
>>> type(a)
<type 'str'>
>>> b =10
>>> type(b)
<type 'int'>
Czytałem w Elixirze, że istnieją narzędzia do sprawdzania typów, takie jak „is_bitstring”, „is_float”, „is_list”, „is_map” itd., Ale co jeśli nie masz pojęcia, jaki może to być typ?
typeof(variable)
?foo = [1, "hello", [1, 2, 3]]
, z kodem,Enum.map(foo, fn(x) -> IO.puts x end)
ponieważ [1, 2, 3] zostanie odczytane jako znaki (dlaczego erlang !!?) I pokaże ci kilka uśmiechniętych twarzy (spróbuj!). więc jesteśmy zmuszeni do korzystania z inspekcji, mimo że inspekcja jest potrzebna tylko wtedy, gdy jest to lista, w przeciwnym razie przez większość czasu jej nie potrzebujemy. typeof pozwala nam zamienić instrukcje if (O (n)) na wyszukiwania słownikowe (O (1)).Printable
protokół, który zawija i zmienia zachowanie drukowania, np. listy liczb całkowitych. Tylko upewnij się, że nie używasz go z kodem Erlang - w przeciwnym razie będziesz drapać się po głowie, zastanawiając się, dlaczego zamiast wiadomości widzisz listy liczb całkowitych.Począwszy od
i
elixiru 1.2 jest polecenie w iex, które wyświetli typ i więcej dowolnej zmiennej Elixir.Jeśli zajrzysz do kodu
i
polecenia, zobaczysz, że jest to realizowane za pośrednictwem protokołu.https://github.com/elixir-lang/elixir/blob/master/lib/iex/lib/iex/info.ex
Jeśli chcesz zaimplementować funkcję dla dowolnego typu danych w Elixirze, sposobem na to jest zdefiniowanie protokołu i implementacja protokołu dla wszystkich typów danych, na których ma działać funkcja. Niestety nie możesz używać funkcji protokołu w strażnikach. Jednak prosty protokół „typu” byłby bardzo prosty w implementacji.
źródło
undefined function i/1
- tak samo dla info / 1&i/1
to funkcja włączonaIEx.Helpers
. Jeśli włożysz go&IEx.Helpers.i/1
do swojego waniliowego eliksiru, wygenerujesz plik,CompileError
chyba że umieściłeś go:iex
jako aplikację w swoimmix.exs
.Również do celów debugowania, jeśli nie jesteś w iex, możesz wywołać to bezpośrednio:
źródło
Innym podejściem jest użycie dopasowania wzorców. Załóżmy, że używasz Timex, który używa
%DateTime{}
struktury i chcesz sprawdzić, czy element jest jeden. Możesz znaleźć dopasowanie za pomocą dopasowania do wzorca w metodzie.źródło
switch
/case
.Zostawię to tutaj ze względu na kogoś, kto ma nadzieję, że wymyśli naprawdę rozsądną wersję. W tej chwili nie ma dobrych odpowiedzi na to pojawiające się w Google ...
Ze względu na kompletność przypadki testowe:
Oto rozwiązanie z protokołami; Nie jestem pewien, czy są szybsze (mam nadzieję, że nie robią pętli na wszystkich typach), ale jest dość brzydki (i delikatny; jeśli dodadzą lub usuną podstawowy typ lub zmienną nazwę, to je zepsuje).
źródło
Po prostu wklejam kod z https://elixirforum.com/t/just-created-a-typeof-module/2583/5 :)
źródło
Natknąłem się na sytuację, w której trzeba sprawdzić parametr musi być określonego typu. Może można aktywować w lepszy sposób.
Lubię to:
Stosowanie:
źródło
Tylko dlatego, że nikt o tym nie wspomniał
IO.inspect/1
Dane wyjściowe do konsoli obiektu ... jest prawie równoważne z JSON.stringify
Bardzo pomocne, gdy po prostu nie możesz przez całe życie dowiedzieć się, jak wygląda przedmiot w teście.
źródło