2016-05-17 6 views
1

私はEnum.eachの関数内の変数に値を設定しようとしていますが、ループの最後に変数は空であり、なぜこの動作が正しいかわかりません。Enum.each内で設定された変数が保存されないのはなぜですか?

コード:この例で

base = "master" 
candidates = ["stream", "pigeons", "maters"] 

return = [] 
Enum.each(candidates, fn candidate -> 
    cond do 
     String.length(base) == String.length(candidate) -> 
      return = return ++ [candidate] 
     true -> 
      true 
    end 
end) 
IO.inspect return 

return["stream", "maters"]ことが予想されるが、代わりに、それだけで空のリストである:これはなぜ起こるか[]

私の質問です。

String.length(base) == String.length(candidate)はすでにセット内のパターンである、trueに相当することができます:私は言語で働いたことがありませんが、カップルの事が心に春から

答えて

4

エリクシールのような言語を扱うときは、「変数」の代わりに「値」と「名前」という言葉を考えるのが良いでしょう。

あなたが望むことができない理由は、エリクサーは"lexical scoping"です。 "変数"に割り当てると、内部スコープに新しい値を作成します。外側のスコープで定義された "名前"の "値"は決して変更しません。

(あなたはおそらく、あなたがEnum.filter/2で欲しいものを得ることができますが、私は、これは単なる例示で推測している)

EDIT:、エリクサーは、あなたがこのような何かを書くことができます今日のよう

if condition_that_evals_to_false do 
    x = 1 
else 
    x = 2 
end 

IO.inspect x # => 2 

`` `

しかし、これは

エリクシール1.3で廃止されます
0

わかりません、。

また、戻り変数のスコープの問題である可能性があります。ローカルリターンがグローバルリターンを隠している可能性があります。これを確認するには、繰り返しごとにreturnを出力します。それぞれの反復には、単一のエントリが含まれていなければなりません。

+0

ローカル値がグローバルと異なることは間違いありません。 –

4

フィルタリングするだけの理由はありますか?

とにかく、エリクシールでは不可能なリターンの値を変更しようとしているようです。

base = "master" 
candidates = ["stream", "pigeon", "maters"] 
result = Enum.filter(candidates, fn(candidate) -> 
    length(candidate) == length(base) 
end 

IO.inspect result 

編集:私はまた、それがあなたのロジックに基づいて、候補者のすべてが、これはバグである

+0

返されるすべてについて正しいです。私はこの例でタイプミスをして編集しました。 –

+0

あなたのロジックについて、はい、私よりはるかに優れています、ありがとう! :) –

+0

私の問題はあなたのロジックで解決されますが、質問にはまだ答えが必要です。このため、質問を閉じるためにあなたの答えを選ぶことはできません。ありがとう;) –

-1

返される追加したいと思います。 Elixir's documentationから:

注:により、周囲のスコープに0.12.xシリーズは、condの条件実際 リークバインディングのバグ。これは、 0.13.1で修正される必要があります。

@ {Christopher Yammine}のようにフィルタリングすることをおすすめします。

+0

あなたは約9ヶ月遅れです。エリクサーは現在1.2.5にあります –

+0

うーん...それはロンの昼寝でした。更新のためのThx –

関連する問題