2014-12-15 11 views
9

, şu ben yanlış yaptığına emin değilim hatası ... Aşağıdaki hataİksir hatası "erlang hata: guard_expr" <code>iex</code> konsolunda

case %{} do 
    x when x == %{} -> true 
    _x -> false 
end 

Sonuçlar bulundu:

Ayrıca, bunu nasıl bulduğumu açıklamak istedim. Elixir'in uygulamasına bakarak ve [], {} ve %{}'unve nil ile aynı olması için değiştirerek kendi || makromumu kendim yapmaya çalıştım.

defmodule Or do 
    defmacro left || right do 
    quote do 
     case unquote(left) do 
     x when x in [false, nil] or x == [] or x == {} or x == %{} -> 
      unquote(right) 
     x -> 
      x 
     end 
    end 
    end 
end 

or x == %{} işlerin yapar uzağa alınması: https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L2313

İşte o uygulama (aynı sorun var) var.

+1

Garip. Değişken derlemeler yerine bir değişken kullanmak, yani: 'y =% {}; case y, do: (x x == y olduğunda -> true; _x -> false) ' – Christian

+0

Evet ve yalnızca bir soruna neden olan haritalar, [] veya başka bir şey çökmesine neden olmaz. – mgwidmann

+0

Strangely, bu aynı bekçi bir işlev tanımında kullanıldığında, çökmez ... – mgwidmann

cevap

1

Bu bir Erlang hatası gibi görünüyor. İşte sorunu çoğaltmak için erlang kodu:

case #{} of X when X == #{} -> X end. 

Onaylama için herkese teşekkürler! Daha fazla bilgi için yorumlara bakın.

İlgili konular