2016-09-20 5 views
3

'variable constant1 is unused'오류가 발생하는 사례가 있습니다. 변수를 무시하고 최상위 라인을 반환하는 것으로 보이므로 변수에 범위가 분명히 없습니다. 상수를 1로 바꾸면 작동합니다. 엘릭서에서 이것을하는 가장 좋은 방법은 무엇입니까?Elixir : case 문에서 변수 사용

warning: variable constant1 is unused 
    Untitled 9:15 

{1, 2, 3, 4} 

도 작동하지 않는 변수에 상수를 변경 : 여기

defmodule Main 
do 
    def constant1, do: 1 
    def constant2, do: 1 
    def constant3, do: 1 

    x = 1 
    y = 0 
    z = 0 

    {a, b, c, d} = 
     case {x, y, z} do 
      {constant1, constant2, constant3} -> {1, 2, 3, 4} 
      {constant1, constant2, _} -> {5, 6, 7, 8} 
      {constant1, _, _} -> {9, 10, 11, 12} 
      {_, _, _} -> {13, 14, 15, 16} 
     end 

    IO.inspect {a, b, c, d} 
end 

이 출력됩니다.

답변

2

constant1을 함수로 정의했습니다. 패턴 매칭에서 사용하려고하면 Elixir는 변수가 거기에있을 것으로 예상하고 오류가 발생합니다. 함수에 패턴 매칭 할 수 없습니다. 당신이 원하는 것 무엇

가능성이 있습니다 :

또한
defmodule Main do 
    constant1 = 1 
    constant2 = 1 
    constant3 = 1 

    x = 1 
    y = 0 
    z = 0 

    {a, b, c, d} = 
     case {x, y, z} do 
      {^constant1, ^constant2, ^constant3} -> {1, 2, 3, 4} 
      {^constant1, ^constant2, _} -> {5, 6, 7, 8} 
      {^constant1, _, _} -> {9, 10, 11, 12} 
      {_, _, _} -> {13, 14, 15, 16} 
     end 

    IO.inspect {a, b, c, d} 
end 
#⇒ { 9, 10, 11, 12 } 

, 이미 값을 정의하는 패턴 일치에 그 기억하십시오, 하나는 정규 앞에 the pin operator ^를 사용한다, 그렇지 않으면 코드

a = 42 
case x do 
    a -> ... 
end 

의 값을 a으로 덮어 쓰고 블록의 범위 인 x의 값으로 설정합니다 (외부). . 경우에만 x == 42 A가 42 유지됩니다) ^으로, 아래의 코드가 일치 :

a = 42 
case x do 
    ^a -> ... 
end 
+0

답변 해 주셔서 감사합니다. 변수 대신 전역 상수를 사용하려면 어떻게해야합니까? @ constant1 구문을 사용하여 시도했지만 단항 연산자 ^에 대한 잘못된 인수가 잘못되었습니다. 기존 변수가 예상 됨 :^@ constant1 – iphaaw

+0

수 없습니다. https://github.com/elixir-lang/elixir/issues/2963 기본적으로 Elixir 모듈 속성은 컴파일 타임에만 사용할 수 있기 때문에 (Erlang과 달리) 모듈에 저장되지 않기 때문입니다. – mudasobwa

+0

대신 전역 변수를 사용할 수 있습니까? – iphaaw

1

에 대해 후속 질문에 응답 "어떻게", "I 등 전역,"

을 사용할 수 있습니다 엘 릭서 (알려진 모든 기능 언어들)는 "글로벌"이라는 개념을 가지고 있지 않습니다. 왜냐하면 모든 것이 외부 관점에서 불변하기 때문입니다. 실제 상수이 매크로로 구현됩니다. 컴파일 후 Main 코드에 더 이상 Constants.constant1이 없기 때문에,

defmodule Constants do 
    defmacro constant1 do 
     quote do: 1 
    end 
    defmacro constant2 do 
     quote do: 1 
    end 
    defmacro constant3 do 
     quote do: 1 
    end 
end 

defmodule Main do 
    require Constants 

    x = 1 
    y = 0 
    z = 0 

    {a, b, c, d} =· 
     case {x, y, z} do 
      {Constants.constant1, Constants.constant2, Constants.constant3} -> {1, 2, 3, 4} 
      {Constants.constant1, Constants.constant2, _} -> {5, 6, 7, 8} 
      {Constants.constant1, _, _} -> {9, 10, 11, 12} 
      {_, _, _} -> {13, 14, 15, 16} 
     end 

    IO.inspect {a, b, c, d} 
end 

위 작품 : 매크로는 AST로 컴파일 단계에서 컴파일 따라서 상수 내부의 일치로 사용될 수있는 실제 값이 있습니다 1 S와 코드 을 실행중인 :

 case {x, y, z} do 
      {1, 1, 1} -> {1, 2, 3, 4} 
      {1, 1, _} -> {5, 6, 7, 8} 
      {1, _, _} -> {9, 10, 11, 12} 
      {_, _, _} -> {13, 14, 15, 16} 
     end 

는 도움이되기를 바랍니다.