한 줄의 즐거움 테스트를 닫을 수 있다면 매우 유용할 것이다

5060 단어 happy

묘사

제 코드가 좀 비슷해요.
  def update(conn, %{"uid" => uid_param, "name" => name_param, "pidx" => pidx, "perm" => perm_params} = params) do
    happy_path! do
      # snip
      {redirect, redirect_to} = case Map.get(params, "redirect", nil) do
        "show" -> {"show", permissions_path(conn, :show, uid, name)}
        _ -> {nil, permissions_path(conn, :index, uid)}
      end
      # snip
    end
  end
일치가 완전히 일치하므로 투석기 문제가 발생할 수 있습니다.
permissions_controller.ex:112: The variable _@8 can never match since previous clauses completely covered the type {'nil' | <<_:32>>,_}
나는 그것들을 두 가지 다른 상황으로 나누어 하나의 변수로 설정할 수 있지만, 이것은 매우 시끄럽고, 내가 더 좋아하는 것을 분리할 수 있다.이런 표현식의 내부 즐거움 사례 생성을 금지할 수 있는 특수한 tag나 어떤 것(나는 이름을 생각하지 못했고 너무 길다)을 사용할 수 있습니까? 그러면 나는 이렇게 해서 투석기를 기쁘게 할 수 있습니다.
  def update(conn, %{"uid" => uid_param, "name" => name_param, "pidx" => pidx, "perm" => perm_params} = params) do
    happy_path! do
      # snip
      @already_happy {redirect, redirect_to} = case Map.get(params, "redirect", nil) do
        "show" -> {"show", permissions_path(conn, :show, uid, name)}
        _ -> {nil, permissions_path(conn, :index, uid)}
      end
      # snip
    end
  end
내 머릿속에 나타날 수 있는 이름: @already_happy,@happy,@ignore,등등...
더 좋은 방법은 태그를 사용하지 않고 표현식의 반환 형식에 일치하는 것입니다. 항상 일치하는지 확인하고, 항상 일치하면 내부 대소문자를 보내지 마십시오.이렇게 하는 것이 더 어렵지만 더 정확할 것이다.@nomatch 기능 제안에 감사드립니다.그것은 현재

토론 #1

에 포함되어 있다
https://github.com/vic/happy#happy-태그v1.3.0가 완벽해 보이는데 다음에 기회가 되면 테스트해 보겠습니다. 문제가 발견되지 않으면 닫겠습니다.:-)

토론 #2

에서 버그가 발견되었습니다. 여기에

토론 #셋

:
      @happy {redirect, redirect_to} = case Map.get(params, "redirect", nil) do
        "show" -> {"show", permissions_path(conn, :show, uid, name)}
        _ -> {nil, permissions_path(conn, :index, uid)}
      end
오류가 발생했습니다.
== Compilation error on file web/controllers/auth/permissions_controller.ex ==
** (ArgumentError) expected 0 or 1 argument for @happy, got: 2
    (elixir) lib/kernel.ex:2381: Kernel.do_at/4
    (elixir) expanding macro: Kernel.@/1
    web/controllers/auth/permissions_controller.ex:52: MyServer.Auth.PermissionsController.create/2
    (elixir) expanding macro: Kernel.|>/2
    web/controllers/auth/permissions_controller.ex:48: MyServer.Auth.PermissionsController.create/2
    (elixir) expanding macro: Kernel.|>/2
    web/controllers/auth/permissions_controller.ex:48: MyServer.Auth.PermissionsController.create/2
    (elixir) expanding macro: Kernel.|>/2
    web/controllers/auth/permissions_controller.ex:48: MyServer.Auth.PermissionsController.create/2
    expanding macro: Happy.happy_path!/1
    web/controllers/auth/permissions_controller.ex:48: MyServer.Auth.PermissionsController.create/2
    (elixir) lib/kernel/parallel_compiler.ex:116: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1
같은 오류이므로 #6과 관련이 있는 것 같습니다.@happy 몇 가지 테스트:
iex> defmodule Testering do def t(), do: (quote do happy_path! do {a, b} = case a_var do true -> {:a, :b}; _ -> {:c, :d} end end end |> Macro.expand(__ENV__) |> Macro.to_string) end; Testering.t()
"{a, b} = case(a_var) do\n  true ->\n    {:a, :b}\n  _ ->\n    {:c, :d}\nend"

iex> defmodule Testering do def t(), do: (quote do happy_path! do @happy {a, b} = case a_var do true -> {:a, :b}; _ -> {:c, :d} end end end |> Macro.expand(__ENV__) |> Macro.to_string) end; Testering.t()
** (ArgumentError) expected 0 or 1 argument for @happy, got: 2
    (elixir) lib/kernel.ex:2381: Kernel.do_at/4
    (elixir) expanding macro: Kernel.@/1
             iex: Testering.t/0

iex> defmodule Testering do def t(), do: (quote do happy_path! do @blahblah {a, b} = case a_var do true -> {:a, :b}; _ -> {:c, :d} end end end |> Macro.expand(__ENV__) |> Macro.to_string) end; Testering.t()
** (ArgumentError) expected 0 or 1 argument for @blahblah, got: 2
    (elixir) lib/kernel.ex:2381: Kernel.do_at/4
    (elixir) expanding macro: Kernel.@/1
             iex: Testering.t/0
편집:추가:
iex> defmodule Testering do def t(), do: (quote do happy_path! do @happy {a, b} = {:c, :d} end end |> Macro.expand(__ENV__) |> Macro.to_string) end; Testering.t()
** (ArgumentError) cannot set attribute @happy inside function/macro
    (elixir) lib/kernel.ex:2336: Kernel.do_at/4
    (elixir) expanding macro: Kernel.@/1
             iex: Testering.t/0
어쩌면 iex의 이상한 점일지도 몰라...

좋은 웹페이지 즐겨찾기