2016-04-13 7 views
1

なぜこのコンパイラの警告が出るのかわかりません。私はここで間違って何をしていますか?前の節が常に一致するため、この句は一致しません

defmodule T do 
    def get_length do 
     with {:ok, file} <- File.read("<file>"), 
      content <- String.downcase(file) do 
       IO.puts content 
      end 
    end 
end 

警告:ライン4で、前の節は常に

+1

4行目が同じであることを行っていませんこのコードスニペットの4行目として、適切な行番号を入力するか、ファイル全体を投稿することができますか? –

+0

こんにちは@CodyPoll。更新しました。 – theKing

+0

エリクシールのシェルでこれを実行すると、参考まではありません。しかし、私がコマンドラインから実行した場合、私はします。 – theKing

答えて

6

TLDR:withここでは過剰です。 contentが効果的String.downcase/1が提供するものと一致してしまうため

defmodule T do 
    def get_length do 
    {:ok, file} = File.read("<file>") 
    IO.puts String.downcase(file) 
    end 
end 

また、あなたは、コンパイラの警告を取得しています。

冗長モード:

私はあなたがwithの意図を理解してないと思います。 withは、心配している幸せなパスにパターンマッチングを記述することで、多数の奇妙なネストのケースを連鎖させる砂糖です。 、楽しみのためにそう

defp serve(socket) do 
    msg = 
    with {:ok, data} <- read_line(socket), 
     {:ok, command} <- KVServer.Command.parse(data), 
     do: KVServer.Command.run(command) 

    write_line(socket, msg) 
    serve(socket) 
end 

の状況を作ってみよう:

ので、代わりにこのような凶悪な何かを書くことで...

defp serve(socket) do 
    msg = 
    case read_line(socket) do 
     {:ok, data} -> 
     case KVServer.Command.parse(data) do 
      {:ok, command} -> 
      KVServer.Command.run(command) 
      {:error, _} = err -> 
      err 
     end 
     {:error, _} = err -> 
     err 
    end 

    write_line(socket, msg) 
    serve(socket) 
end 

...あなたはこの素敵な魔法を書くことができますファイルの例として、withを使用することができました。

ここで定義された関数は、かなり複雑な失敗例

を持っている想像し
defmodule X do 
    def extract_header(file) do 
    # returns {:ok, file} or {:err, file} or whatever 
    end 

    def starts_with_emoji?(file) do 
    # returns true or false 
    end 
end 

あなたが便利になることができる方法with見ることができます。ファイルの

defmodule T do 
    def header_emoji_alert do 
    with {:ok, file} <- File.read("<file>"), 
     {:ok, header} <- X.extract_header(file), 
     true <- X.starts_with_emoji?(header), do: IO.puts("EMOJI!!!!") 
    end 
end 
+0

彼の(無名の代名詞の意味)意図がここにあるのかどうかは、やや難しいです。 –

+0

はい私は単純なケースを提示しました。そして私はそれが1つの幸せな道であることを知っています。私の流暢さが好きなので、私の目標はと一緒に使うことに慣れることでした。だから私は幸せなパスのためだけに使用しているので、私はコンパイラ警告を得ていますか? – theKing

+0

説明ありがとうございます。それは理にかなっている。私は警告によって捨てられたばかりだった。 – theKing

3

に一致するため、この句が一致しないことができますが、実際にこれを行うにはもしかして?

defmodule T do 
    def get_length do 
    with {:ok, file} <- File.read("<file>") do 
     content = String.downcase(file) #Assigning result of String.downcase will _always_ work. 
     IO.puts content 
    end 
    end 
end 

それはあなたのコードの意図を推測するために正直少し難しいです。私は(私の知る限り)これも

defmodule T do 
    def get_length do 
    {:ok, file} = File.read("<file>") 
    content = String.downcase(file) 
    IO.puts content 
    end 
end 

私はwithがここであなたに何を得ている使用している私はよく分からないと言うことを意味し、同じことをするだろう意味します。

ErlangとElixirでは、File.readから{:ok, file}タプル以外のものが返ってくるとエラーが出ることがあります。ファイルを読み取れない場合は、本当に復旧オプションはありませんか?

関連する問題