2016-05-25 10 views
6

私は最近エリクールを学ぶことに決めました。 C++/Java/JavaScriptのバックグラウンドから来て、私は基本を掴むのに苦労しました。これは愚かに聞こえるかもしれませんが、エリクサーではどのようにステートメントを返しますか?私の周り見てきたし、それが機能すなわちエリクシルの値を返しますか?

def Hello do 
    "Hello World!" 
end 

、リターンを行うための別の方法は、この関数の戻り値に「Hello World!」をそこにあるだろうのちょうど最後の行だかのように思えますか?また、どのように早く帰りますか?

function foo(a){ 
    for(var i = 0;i<a.length;i++){ 
     if(a[i] == "22"){ 
     return true; 
     } 
    } 
    return false; 
} 

どうエリクサーでその仕事になります。JavaScriptで私たちは、アレイはそれで特定の値を持っている場合は見つけるために、このような何かを書くことができますか?

+1

早戻しのもう1つの例を次に示します。http://elixir-examples.github。io/examples/return-early – Brandon

+0

@Brandon、ありがとう、その例では "some_condition"がfalseなら "do_something()"が出力する値を出力します? –

+0

それはまったくばかげた質問ではありません。命令型言語に慣れてきたときに計算された最後の値を返すすべての関数の概念に慣れるのは本当に難しいです。それに固執する - すべての関数が値を返すという考えに慣れれば、関数がより密接になることがわかります。 –

答えて

5

エリクシールは、他の言語の「リターン」キーワードに相当しますNO「抜け出す」キーワードを持っていません。

通常、実行する最後のステートメントが戻り値になるように、コードを再構成する必要があります。

以下

「」あなたの最初の例のように、アレイの種類を振る舞うものとして、あなたが意味と仮定して、あなたのコードのテストと同等のものを実行するためにエリキシルで慣用の方法である:実際に何が起こっている

def is_there_a_22(a) do 
    Enum.any?(a, fn(item) -> item == "22" end.) 
end 

ここで私たちは思考を少しずつ再構築しています。手続き型アプローチの代わりに、配列を検索して、探していたものが見つかると早期に戻ると、コードスニペットで実際に何をしているのかを尋ねます: "この配列には22どこに? "

私たちは、エリキシルのEnumライブラリを使用して配列を実行し、any?関数に、私たちが気にしていた条件に一致するものがあるかどうかを示すテストを提供します。

これは列挙で簡単に解決できるケースですが、質問の中心は手続き型メソッドで使用される「バウンサーパターン」などのものに多く当てはまる可能性があります。たとえば、方法で特定の基準を満たしている場合は、すぐに戻ります。この良い例は、あなたが仕事をやろうとしている事がnullの場合はfalseを返すメソッドのようになります。

function is_my_property_true(obj) { 
    if (obj == null) { 
    return false; 
    } 
    // .....lots of code.... 
    return some_result_from_obj; 
} 

本当に万能薬ではこれを実現する唯一の方法は、アップフロントガードを置くことで、方法を除外してください:

def test_property_val_from_obj(obj) do 
    # ...a bunch of code about to get the property 
    # want and see if it is true 
end 

def is_my_property_true(obj) do 
    case obj do 
    nil -> false 
    _ -> test_property_value_from_obj(obj) 
    end 
end 

tl;いいえ、同等品がありません - それに応じてコードを構造化する必要があります。反対に、これはあなたの方法を小さく保つ傾向があり、あなたの意図ははっきりしています。

+0

これは非常に意味があります。とても詳しく説明してくれてありがとう –

4

最後の式が常に返されるという点で正しいです。さらに言えば、言語には文がなく、ただの表現である。すべての構成には値if,caseなどがあります。早期返却もありません。これは限られているように見えますが、すぐにそれに慣れます。

高階関数を用いることであろう霊薬とあなたの例を解決するために、通常の方法:

def foo(list) do 
    Enum.any?(list, fn x -> x == "22" end) 
end 
+0

説明のためにありがとう私はエリクシルのステートメントレスについて私の頭を包んでいなければならない。 –

関連する問題