Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
abe61054
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
abe61054
编写于
7月 23, 2011
作者:
A
Aaron Patterson
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2217 from marcandre/fix_enumerable
Fix enumerable
上级
21150684
f061ffd9
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
74 addition
and
32 deletion
+74
-32
activesupport/lib/active_support/core_ext/enumerable.rb
activesupport/lib/active_support/core_ext/enumerable.rb
+16
-6
activesupport/test/core_ext/enumerable_test.rb
activesupport/test/core_ext/enumerable_test.rb
+58
-26
未找到文件。
activesupport/lib/active_support/core_ext/enumerable.rb
浏览文件 @
abe61054
...
@@ -20,6 +20,7 @@ module Enumerable
...
@@ -20,6 +20,7 @@ module Enumerable
# "2006-02-24 -> Transcript, Transcript"
# "2006-02-24 -> Transcript, Transcript"
# "2006-02-23 -> Transcript"
# "2006-02-23 -> Transcript"
def
group_by
def
group_by
return
to_enum
:group_by
unless
block_given?
assoc
=
ActiveSupport
::
OrderedHash
.
new
assoc
=
ActiveSupport
::
OrderedHash
.
new
each
do
|
element
|
each
do
|
element
|
...
@@ -75,9 +76,10 @@ def sum(identity = 0, &block)
...
@@ -75,9 +76,10 @@ def sum(identity = 0, &block)
#
#
# (1..5).each_with_object(1) { |value, memo| memo *= value } # => 1
# (1..5).each_with_object(1) { |value, memo| memo *= value } # => 1
#
#
def
each_with_object
(
memo
,
&
block
)
def
each_with_object
(
memo
)
return
to_enum
:each_with_object
,
memo
unless
block_given?
each
do
|
element
|
each
do
|
element
|
block
.
call
(
element
,
memo
)
yield
element
,
memo
end
end
memo
memo
end
unless
[].
respond_to?
(
:each_with_object
)
end
unless
[].
respond_to?
(
:each_with_object
)
...
@@ -90,14 +92,22 @@ def each_with_object(memo, &block)
...
@@ -90,14 +92,22 @@ def each_with_object(memo, &block)
# => { "Chade- Fowlersburg-e" => <Person ...>, "David Heinemeier Hansson" => <Person ...>, ...}
# => { "Chade- Fowlersburg-e" => <Person ...>, "David Heinemeier Hansson" => <Person ...>, ...}
#
#
def
index_by
def
index_by
return
to_enum
:index_by
unless
block_given?
Hash
[
map
{
|
elem
|
[
yield
(
elem
),
elem
]
}]
Hash
[
map
{
|
elem
|
[
yield
(
elem
),
elem
]
}]
end
end
# Returns true if the
collection has more than 1 element. Functionally equivalent to collection
.size > 1.
# Returns true if the
enumerable has more than 1 element. Functionally equivalent to enum.to_a
.size > 1.
# Can be called with a block too, much like any?, so people.many? { |p| p.age > 26 } returns true if more than 1 person is over 26.
# Can be called with a block too, much like any?, so people.many? { |p| p.age > 26 } returns true if more than 1 person is over 26.
def
many?
(
&
block
)
def
many?
size
=
block_given?
?
count
(
&
block
)
:
self
.
size
cnt
=
0
size
>
1
if
block_given?
any?
do
|
element
|
cnt
+=
1
if
yield
element
cnt
>
1
end
else
any?
{
(
cnt
+=
1
)
>
1
}
end
end
end
# The negative of the Enumerable#include?. Returns true if the collection does not include the object.
# The negative of the Enumerable#include?. Returns true if the collection does not include the object.
...
...
activesupport/test/core_ext/enumerable_test.rb
浏览文件 @
abe61054
...
@@ -8,6 +8,19 @@ def +(p) self.class.new(price + p.price) end
...
@@ -8,6 +8,19 @@ def +(p) self.class.new(price + p.price) end
end
end
class
EnumerableTests
<
Test
::
Unit
::
TestCase
class
EnumerableTests
<
Test
::
Unit
::
TestCase
Enumerator
=
[].
each
.
class
class
GenericEnumerable
include
Enumerable
def
initialize
(
values
=
[
1
,
2
,
3
])
@values
=
values
end
def
each
@values
.
each
{
|
v
|
yield
v
}
end
end
def
test_group_by
def
test_group_by
names
=
%w(marcel sam david jeremy)
names
=
%w(marcel sam david jeremy)
klass
=
Struct
.
new
(
:name
)
klass
=
Struct
.
new
(
:name
)
...
@@ -17,7 +30,8 @@ def test_group_by
...
@@ -17,7 +30,8 @@ def test_group_by
people
<<
p
people
<<
p
end
end
grouped
=
objects
.
group_by
{
|
object
|
object
.
name
}
enum
=
GenericEnumerable
.
new
(
objects
)
grouped
=
enum
.
group_by
{
|
object
|
object
.
name
}
grouped
.
each
do
|
name
,
group
|
grouped
.
each
do
|
name
,
group
|
assert
group
.
all?
{
|
person
|
person
.
name
==
name
}
assert
group
.
all?
{
|
person
|
person
.
name
==
name
}
...
@@ -25,20 +39,24 @@ def test_group_by
...
@@ -25,20 +39,24 @@ def test_group_by
assert_equal
objects
.
uniq
.
map
(
&
:name
),
grouped
.
keys
assert_equal
objects
.
uniq
.
map
(
&
:name
),
grouped
.
keys
assert
({}.
merge
(
grouped
),
"Could not convert ActiveSupport::OrderedHash into Hash"
)
assert
({}.
merge
(
grouped
),
"Could not convert ActiveSupport::OrderedHash into Hash"
)
assert_equal
Enumerator
,
enum
.
group_by
.
class
assert_equal
grouped
,
enum
.
group_by
.
each
(
&
:name
)
end
end
def
test_sums
def
test_sums
assert_equal
30
,
[
5
,
15
,
10
].
sum
enum
=
GenericEnumerable
.
new
([
5
,
15
,
10
])
assert_equal
30
,
[
5
,
15
,
10
].
sum
{
|
i
|
i
}
assert_equal
30
,
enum
.
sum
assert_equal
60
,
enum
.
sum
{
|
i
|
i
*
2
}
assert_equal
'abc'
,
%w(a b c)
.
sum
enum
=
GenericEnumerable
.
new
(
%w(a b c)
)
assert_equal
'abc'
,
%w(a b c)
.
sum
{
|
i
|
i
}
assert_equal
'abc'
,
enum
.
sum
assert_equal
'aabbcc'
,
enum
.
sum
{
|
i
|
i
*
2
}
payments
=
[
Payment
.
new
(
5
),
Payment
.
new
(
15
),
Payment
.
new
(
10
)
]
payments
=
GenericEnumerable
.
new
([
Payment
.
new
(
5
),
Payment
.
new
(
15
),
Payment
.
new
(
10
)
])
assert_equal
30
,
payments
.
sum
(
&
:price
)
assert_equal
30
,
payments
.
sum
(
&
:price
)
assert_equal
60
,
payments
.
sum
{
|
p
|
p
.
price
*
2
}
assert_equal
60
,
payments
.
sum
{
|
p
|
p
.
price
*
2
}
payments
=
[
SummablePayment
.
new
(
5
),
SummablePayment
.
new
(
15
)
]
payments
=
GenericEnumerable
.
new
([
SummablePayment
.
new
(
5
),
SummablePayment
.
new
(
15
)
])
assert_equal
SummablePayment
.
new
(
20
),
payments
.
sum
assert_equal
SummablePayment
.
new
(
20
),
payments
.
sum
assert_equal
SummablePayment
.
new
(
20
),
payments
.
sum
{
|
p
|
p
}
assert_equal
SummablePayment
.
new
(
20
),
payments
.
sum
{
|
p
|
p
}
end
end
...
@@ -46,21 +64,21 @@ def test_sums
...
@@ -46,21 +64,21 @@ def test_sums
def
test_nil_sums
def
test_nil_sums
expected_raise
=
TypeError
expected_raise
=
TypeError
assert_raise
(
expected_raise
)
{
[
5
,
15
,
nil
]
.
sum
}
assert_raise
(
expected_raise
)
{
GenericEnumerable
.
new
([
5
,
15
,
nil
])
.
sum
}
payments
=
[
Payment
.
new
(
5
),
Payment
.
new
(
15
),
Payment
.
new
(
10
),
Payment
.
new
(
nil
)
]
payments
=
GenericEnumerable
.
new
([
Payment
.
new
(
5
),
Payment
.
new
(
15
),
Payment
.
new
(
10
),
Payment
.
new
(
nil
)
])
assert_raise
(
expected_raise
)
{
payments
.
sum
(
&
:price
)
}
assert_raise
(
expected_raise
)
{
payments
.
sum
(
&
:price
)
}
assert_equal
60
,
payments
.
sum
{
|
p
|
p
.
price
.
to_i
*
2
}
assert_equal
60
,
payments
.
sum
{
|
p
|
p
.
price
.
to_i
*
2
}
end
end
def
test_empty_sums
def
test_empty_sums
assert_equal
0
,
[]
.
sum
assert_equal
0
,
GenericEnumerable
.
new
([])
.
sum
assert_equal
0
,
[].
sum
{
|
i
|
i
}
assert_equal
0
,
GenericEnumerable
.
new
([]).
sum
{
|
i
|
i
+
10
}
assert_equal
Payment
.
new
(
0
),
[]
.
sum
(
Payment
.
new
(
0
))
assert_equal
Payment
.
new
(
0
),
GenericEnumerable
.
new
([])
.
sum
(
Payment
.
new
(
0
))
end
end
def
test_
enumerabl
e_sums
def
test_
rang
e_sums
assert_equal
20
,
(
1
..
4
).
sum
{
|
i
|
i
*
2
}
assert_equal
20
,
(
1
..
4
).
sum
{
|
i
|
i
*
2
}
assert_equal
10
,
(
1
..
4
).
sum
assert_equal
10
,
(
1
..
4
).
sum
assert_equal
10
,
(
1
..
4.5
).
sum
assert_equal
10
,
(
1
..
4.5
).
sum
...
@@ -69,29 +87,43 @@ def test_enumerable_sums
...
@@ -69,29 +87,43 @@ def test_enumerable_sums
end
end
def
test_each_with_object
def
test_each_with_object
result
=
%w(foo bar)
.
each_with_object
({})
{
|
str
,
hsh
|
hsh
[
str
]
=
str
.
upcase
}
enum
=
GenericEnumerable
.
new
(
%w(foo bar)
)
result
=
enum
.
each_with_object
({})
{
|
str
,
hsh
|
hsh
[
str
]
=
str
.
upcase
}
assert_equal
({
'foo'
=>
'FOO'
,
'bar'
=>
'BAR'
},
result
)
assert_equal
({
'foo'
=>
'FOO'
,
'bar'
=>
'BAR'
},
result
)
assert_equal
Enumerator
,
enum
.
each_with_object
({}).
class
result2
=
enum
.
each_with_object
({}).
each
{
|
str
,
hsh
|
hsh
[
str
]
=
str
.
upcase
}
assert_equal
result
,
result2
end
end
def
test_index_by
def
test_index_by
payments
=
[
Payment
.
new
(
5
),
Payment
.
new
(
15
),
Payment
.
new
(
10
)
]
payments
=
GenericEnumerable
.
new
([
Payment
.
new
(
5
),
Payment
.
new
(
15
),
Payment
.
new
(
10
)
])
assert_equal
({
5
=>
payments
[
0
],
15
=>
payments
[
1
],
10
=>
payments
[
2
]
},
assert_equal
({
5
=>
Payment
.
new
(
5
),
15
=>
Payment
.
new
(
15
),
10
=>
Payment
.
new
(
10
)
},
payments
.
index_by
{
|
p
|
p
.
price
})
payments
.
index_by
{
|
p
|
p
.
price
})
assert_equal
Enumerator
,
payments
.
index_by
.
class
assert_equal
({
5
=>
Payment
.
new
(
5
),
15
=>
Payment
.
new
(
15
),
10
=>
Payment
.
new
(
10
)
},
payments
.
index_by
.
each
{
|
p
|
p
.
price
})
end
end
def
test_many
def
test_many
assert
!
[].
many?
assert_equal
false
,
GenericEnumerable
.
new
([]
).
many?
assert
!
[
1
].
many?
assert_equal
false
,
GenericEnumerable
.
new
([
1
]
).
many?
assert
[
1
,
2
].
many?
assert_equal
true
,
GenericEnumerable
.
new
([
1
,
2
]
).
many?
assert
!
[].
many?
{
|
x
|
x
>
1
}
assert_equal
false
,
GenericEnumerable
.
new
([]
).
many?
{
|
x
|
x
>
1
}
assert
!
[
2
].
many?
{
|
x
|
x
>
1
}
assert_equal
false
,
GenericEnumerable
.
new
([
2
]
).
many?
{
|
x
|
x
>
1
}
assert
!
[
1
,
2
].
many?
{
|
x
|
x
>
1
}
assert_equal
false
,
GenericEnumerable
.
new
([
1
,
2
]
).
many?
{
|
x
|
x
>
1
}
assert
[
1
,
2
,
2
].
many?
{
|
x
|
x
>
1
}
assert_equal
true
,
GenericEnumerable
.
new
([
1
,
2
,
2
]).
many?
{
|
x
|
x
>
1
}
end
def
test_many_iterates_only_on_what_is_needed
infinity
=
1.0
/
0.0
very_long_enum
=
0
..
infinity
assert_equal
true
,
very_long_enum
.
many?
assert_equal
true
,
very_long_enum
.
many?
{
|
x
|
x
>
100
}
end
end
def
test_exclude?
def
test_exclude?
assert
[
1
]
.
exclude?
(
2
)
assert
_equal
true
,
GenericEnumerable
.
new
([
1
])
.
exclude?
(
2
)
assert
!
[
1
]
.
exclude?
(
1
)
assert
_equal
false
,
GenericEnumerable
.
new
([
1
])
.
exclude?
(
1
)
end
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录