의 많은있을 것입니다 당신이에 대한 기본 절을 구현 관련하여 무엇을 발견, 각 컨트롤러 액션에 대한 def get_object(conn, _params), do: :params_mismatch
을 만들려면 않을 것 명시 적이며 추론하기 쉽고 명시된 바와 같이 기본적으로 각 동작에 대한 코드의 한 줄인 모든 동작에 대해 각 동작이 최상의 방법입니다. ,
defaction get_object(conn, %{"objectId" => object_id}) do
...
end
이 같은 매크로의 구현은 내가 권하고 싶습니다 것이 아니라, 재미와 게임 :
당신은 같이 보일 수있는 보일러를 제거하기 위해 매크로를 사용할 수 있습니다 간단한 구현과 같이 보일 수 있습니다 :
defmacro defaction(signature, do: body) do
{name, argc} =
case signature do
{:when, _, [{name, _, args} | _]} ->
{name, length(args)}
{name, _, args} ->
{name, length(args)}
end
argv = Enum.map(1..argc, fn _ -> quote do _ end end)
quote location: :keep do
def unquote(signature) do
unquote(body)
end
def unquote(name)(unquote_splicing(argv)) do
:params_mismatch
end
end
end
당신은 다음과 같이 작업을 정의 할 수
:
defaction get_object(conn, %{"objectId" => object_id}) do
...
end
또는 : 나는 매크로 정의를 보면 볼 수있는 오류 처리를 가린다뿐만 아니라 더 어려워 코드에 대한 지역의 추론을 할 수 있기 때문에,이 방법에 대해 당신을주의 할
defaction get_object(conn, %{"objectId" => object_id}) when is_binary(object_id) do
...
end
.