iex
कंसोल पर, मैं निम्नलिखित त्रुटि है कि मैं अनिश्चित मैं गलत क्या किया है हूँ ...अमृत त्रुटि "erlang त्रुटि: guard_expr"
case %{} do
x when x == %{} -> true
_x -> false
end
परिणाम मिले:
** (ErlangError) erlang error: :guard_expr
इसके अलावा, मैं यह बताना चाहता था कि मुझे यह कैसे मिला। मैंने elixir के कार्यान्वयन को देखकर और []
,, और %{}
false
और nil
के समान व्यवहार करने के लिए इसे बदलने के लिए अपना ||
मैक्रो बनाने का प्रयास किया।
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 == %{}
चीजें काम करता है: https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L2313
यहाँ है कि कार्यान्वयन (यह एक ही समस्या है) है।
अजीब। शाब्दिक संकलन के स्थान पर एक चर का उपयोग करना, i.e: 'y =% {}; मामला वाई, करें: (x जब x == y -> true; _x -> false) ' – Christian
हां और इसके एकमात्र मानचित्र जो समस्या का कारण बनते हैं, [] या कुछ और इसे क्रैश नहीं करता है। – mgwidmann
आश्चर्यजनक रूप से, जब यह वही गार्ड फ़ंक्शन परिभाषा में उपयोग किया जाता है तो यह क्रैश नहीं होता है ... – mgwidmann