We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent 9897b89 commit 821b7c6Copy full SHA for 821b7c6
lib/elixir/lib/enum.ex
@@ -38,6 +38,7 @@ defprotocol Enumerable do
38
39
@doc """
40
The function is used to check if a value exists within the collection.
41
+ Membership should be tested with the match (`===`) operator.
42
"""
43
def member?(collection, value)
44
@@ -87,6 +88,10 @@ defmodule Enum do
87
88
89
Checks if `value` exists within the `collection`.
90
91
+ Membership is tested with the match (`===`) operator although
92
+ enumerables like ranges may include floats inside the given
93
+ range.
94
+
95
## Examples
96
97
iex> Enum.member?(1..10, 5)
@@ -1850,8 +1855,9 @@ defimpl Enumerable, for: Function do
1850
1855
end
1851
1856
1852
1857
def member?(function, value) do
1853
- function.(false, fn(entry, _) ->
1854
- if entry === value, do: throw(:function_member?), else: false
1858
+ function.(false, fn
1859
+ ^value, _ -> throw(:function_member?)
1860
+ _, _ -> false
1861
end)
1862
catch
1863
:function_member? -> true
lib/elixir/lib/range.ex
@@ -17,15 +17,15 @@ defprotocol Range.Iterator do
17
18
19
defimpl Enumerable, for: Range do
20
- def reduce(Range[first: first] = range, acc, fun) do
+ def reduce(first .. _ = range, acc, fun) do
21
Range.Iterator.reduce(first, range, acc, fun)
22
23
24
- def member?(Range[first: first, last: last], value) do
25
- value in first..last
+ def member?(first .. last, value) do
+ first <= value and value <= last
26
27
28
- def count(Range[first: first] = range) do
+ def count(first .. _ = range) do
29
Range.Iterator.count(first, range)
30
31
lib/elixir/src/elixir_macros.erl
@@ -233,13 +233,13 @@ translate_in(Meta, Left, Right, S) ->
233
{ cons, _, _, _ } ->
234
[H|T] = elixir_utils:cons_to_list(TRight),
235
Expr = lists:foldr(fun(X, Acc) ->
236
- { op, Line, 'orelse', { op, Line, '==', Var, X }, Acc }
237
- end, { op, Line, '==', Var, H }, T),
+ { op, Line, 'orelse', { op, Line, '=:=', Var, X }, Acc }
+ end, { op, Line, '=:=', Var, H }, T),
238
{ Cache, Expr };
239
{ string, _, [H|T] } ->
240
Expr = lists:foldl(fun(X, Acc) ->
241
- { op, Line, 'orelse', { op, Line, '==', Var, { integer, Line, X } }, Acc }
242
- end, { op, Line, '==', Var, { integer, Line, H } }, T),
+ { op, Line, 'orelse', { op, Line, '=:=', Var, { integer, Line, X } }, Acc }
+ end, { op, Line, '=:=', Var, { integer, Line, H } }, T),
243
244
{ tuple, _, [{ atom, _, 'Elixir.Range' }, Start, End] } ->
245
Expr = case { Start, End } of
lib/elixir/test/elixir/dict_test.exs
@@ -327,6 +327,13 @@ defmodule DictTest.Common do
327
refute Dict.equal?(dict1, dict2)
328
329
330
+ test :enum_member do
331
+ assert Enum.member?(new_dict([{1,1}]), { 1, 1 })
332
+ refute Enum.member?(new_dict([{1,1}]), { 1.0, 1 })
333
+ refute Enum.member?(new_dict([{1,1}]), { 1, 1.0 })
334
+ refute Enum.member?(new_dict([{1,1}]), { 1.0, 1.0 })
335
+ end
336
337
test "unsupported dict" do
338
assert_raise ArgumentError, "unsupported dict: :bad_dict", fn ->
339
Dict.to_list :bad_dict
lib/elixir/test/elixir/kernel/case_test.exs
@@ -37,6 +37,10 @@ defmodule Kernel.CaseTest do
37
assert not y in [1, 2, 3], "not in assertion"
+ test :in_with_match do
+ refute 1.0 in [1, 2, 3], "not in assertion"
defp get_case do
45
case internal do
46
:invalid ->
lib/elixir/test/elixir/range_test.exs
@@ -39,6 +39,7 @@ defmodule RangeTest do
refute Enum.empty?(1..1)
assert Enum.member?(1..3, 2)
refute Enum.member?(1..3, 0)
refute Enum.member?(1..3, 4)
refute Enum.member?(3..1, 0)
lib/elixir/test/elixir/set_test.exs
@@ -98,6 +98,11 @@ defmodule SetTest.Common do
98
assert Set.size(Set.union(int_set, new_set([1.0]))) == 4
99
100
101
102
+ assert Enum.member?(int_set, 1)
103
+ refute Enum.member?(int_set, 1.0)
104
105
106
test "unsupported set" do
107
assert_raise ArgumentError, "unsupported set: :bad_set", fn ->
108
Set.to_list :bad_set
0 commit comments