Elixir의 가드 섹션을 사용해보십시오.
9217 단어 Elixir
이 가드절, 상당히 여러가지 조건으로 처리를 분기할 수 있습니다만 인수의 형태에서도 처리 나눌 수 있으므로 오늘은 그것을 시험해 본다
준비하다
우선 라이브러리 생성 약속에 따라
# Bundle gemみたいなコマンド
mix new hoge
# 生成されたディレクトリへ
cd hoge
# とりあえずテストを回しておこう
mix test
테스트하다
Elixir는 테스트 라이브러리가 제대로 들어 있기 때문에 먼저 테스트를 작성합니다.
우선 이번에는 인수를 건네주면 인수의 형명을 캐릭터 라인으로 돌려주는 함수를 구현한다고 하는 것으로
테스트는 이런 식으로
# test/hoge_test.exs
test 'Hoge.type関数は引数の型名を文字列で返す' do
assert Hoge.type(:a) == "Atom"
assert Hoge.type(nil) == "Nil"
assert Hoge.type(1) == "Int"
assert Hoge.type(1.1) == "Float"
assert Hoge.type(true) == "Boolean"
assert Hoge.type("s") == "String"
assert Hoge.type([1,2,3]) == "List"
assert Hoge.type(%{a: 1}) == "Map"
assert Hoge.type({:A, 1}) == "Tupple"
assert Hoge.type(fn -> IO.puts :a end) == "Function"
end
테스트를 거쳤기 때문에 우선
# lib/hoge.ex
def type(x) do
end
이제 테스트를 흘리십시오.
테스트 명령은
Hoge
mix test
1) test 1 is number (HogeTest)
test/hoge_test.exs:13
Assertion with == failed
code: assert Hoge.type(1) == "Int"
left: nil
right: "Int"
stacktrace:
test/hoge_test.exs:14: (test)
...
제대로 떨어지는 것을 확인할 수있었습니다.
구현하다
테스트가 실패하는 것으로 확인되었으므로 구현
def type(x) when is_integer(x), do: "Int"
def type(x) when is_float(x), do: "Float"
def type(x) when is_bitstring(x), do: "String"
def type(x) when is_boolean(x), do: "Boolean" # NOTE: Booleanは内部的にはAtomなのでAtomより先に評価しないとAtom判定される
def type(x) when is_nil(x), do: "Nil" # NOTE: Nilは内部的にはAtomなのでAtomより先に評価しないとAtom判定される
def type(x) when is_atom(x), do: "Atom"
def type(x) when is_list(x), do: "List"
def type(x) when is_tuple(x), do: "Tupple"
def type(x) when is_map(x), do: "Map"
def type(x) when is_function(x), do: "Function"
조심해야 할 것은
mix test
와 Boolean
와 Nil
의 관계이것을 처음으로 알았지 만 Boolean과 Nil은 Atom으로 표현 된 것 같습니다
그래서 Boolean이나 Nil보다 Atom의 Guard절을 위에 쓰면 슬프게 전부 Atom으로서 결과가 돌아온다
우선 구현이 가능했다고 생각하므로 테스트를 흘린다.
mix test
Finished in 0.04 seconds
1 doctest, 1 tests, 0 failures
좋아 보인다!
감상
인수 베이스로 처리를 나누는 것은 다른 언어라면 배드 프랙티스라고 하는 이야기를 듣지만 Elixir도 말해 Erlang가 그러한 언어 사양이기 때문에 이렇게 되는 것은 어쩔 수 없네
모처럼 언어에 이런 글쓰기가 구현되어 있기 때문에 적극적으로 사용하고 싶은 소존
이번에는 조건 나누기에 등가 연산자 등은 사용하지 않았지만 사실은 그러한 것을 사용하여 더 다양한 조건 분기해 갈 수도 있다고 한다
괜찮아...
Reference
이 문제에 관하여(Elixir의 가드 섹션을 사용해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gr8distance/items/4d40f4e2f5d44da03cc6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)