2016-09-20 5 views
3

私はこのケースステートメントに 'variable constant1 is unused'というエラーを出しています。変数を無視してトップラインを返すように見えるので、変数は明らかにスコープを持っていません。定数を1に置き換えると、それは機能します。エリクサーでこれをする最善の方法は何ですか?エリクサー: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 } 

また、パターンマッチすでに定義する値に、1がそうでなければ、コード

a = 42 
case x do 
    a -> ... 
end 
、マッチャーの前で the pin operator ^を使用する必要があることを忘れないでください

の値をaに上書きし、xの値に設定します(範囲はcaseブロック、の範囲外です)。 。は42残ります)^を使用すると、以下のコードは、以下の場合にのみx == 42マッチします:「「どのように」について、その後の質問に答える

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

ご回答いただきありがとうございます。変数の代わりにグローバル定数を使用するにはどうすればよいですか?私は@ constant1構文を使ってみましたが、単項演算子の引数が無効です^、既存の変数が必要です:^ @ constant1 – iphaaw

+0

できません。 https://github.com/elixir-lang/elixir/issues/2963基本的には、エリクシルモジュールの属性はコンパイル時にのみ利用可能であり、(Erlangとは異なり)モジュール内には格納されないからです。 – mudasobwa

+0

代わりにグローバル変数を使用できますか? – iphaaw

1

を私はグローバルを使用することができます」など

Elixir(すべての既知の関数型言語のように)は、すべてが外部から見て不変であるため、「グローバル」という概念はありません。 真の定数がマクロとして実装されています。マクロはASTにコンパイル段階中にコンパイルされるため、試合の内部定数として使用されることがあります。

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 

上記の作品は、コンパイル後Constants.constant1Mainコードにはもう存在しないため:実際の値があります。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 

はそれがお役に立てば幸いです。

関連する問題