Elixir의 가드 섹션을 사용해보십시오.

9217 단어 Elixir
Elixir의 함수에는 인수에 의해 처리를 나누는 기능(Guard절)이라는 것이 존재한다.
이 가드절, 상당히 여러가지 조건으로 처리를 분기할 수 있습니다만 인수의 형태에서도 처리 나눌 수 있으므로 오늘은 그것을 시험해 본다

준비하다



우선 라이브러리 생성 약속에 따라
# 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 testBooleanNil의 관계
이것을 처음으로 알았지 만 Boolean과 Nil은 Atom으로 표현 된 것 같습니다
그래서 Boolean이나 Nil보다 Atom의 Guard절을 위에 쓰면 슬프게 전부 Atom으로서 결과가 돌아온다

우선 구현이 가능했다고 생각하므로 테스트를 흘린다.
mix test

Finished in 0.04 seconds
1 doctest, 1 tests, 0 failures

좋아 보인다!

감상



인수 베이스로 처리를 나누는 것은 다른 언어라면 배드 프랙티스라고 하는 이야기를 듣지만 Elixir도 말해 Erlang가 그러한 언어 사양이기 때문에 이렇게 되는 것은 어쩔 수 없네
모처럼 언어에 이런 글쓰기가 구현되어 있기 때문에 적극적으로 사용하고 싶은 소존
이번에는 조건 나누기에 등가 연산자 등은 사용하지 않았지만 사실은 그러한 것을 사용하여 더 다양한 조건 분기해 갈 수도 있다고 한다
괜찮아...

좋은 웹페이지 즐겨찾기