summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-03-23 16:36:19 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-03-23 16:36:19 +0900
commit9beef5fdb09139e697fc2eb5775b40fa84994fc9 (patch)
treec89d44c37bf073bf59a68c9074e83e5b034892f9
parent85d20127a1ae732b7d6eed042766f3c9ed0e9cb7 (diff)
parentd09e4475bf3272d594e88b41ad1265da2c5517ec (diff)
downloadmruby-9beef5fdb09139e697fc2eb5775b40fa84994fc9.tar.gz
mruby-9beef5fdb09139e697fc2eb5775b40fa84994fc9.zip
Merge pull request #1923 from ksss/hash-enumerator-select
Hash#{select,select!} support return Enumerator
-rw-r--r--mrbgems/mruby-enumerator/test/enumerator.rb14
-rw-r--r--mrblib/hash.rb8
2 files changed, 20 insertions, 2 deletions
diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb
index fdee06450..6c224eaa3 100644
--- a/mrbgems/mruby-enumerator/test/enumerator.rb
+++ b/mrbgems/mruby-enumerator/test/enumerator.rb
@@ -494,6 +494,20 @@ assert 'Hash#each_value' do
assert_equal [1,2], {a:1,b:2}.each_value.to_a.sort
end
+assert 'Hash#select' do
+ h = {1=>2,3=>4,5=>6}
+ hret = h.select.with_index {|a,b| a[1] == 4}
+ assert_equal({3=>4}, hret)
+ assert_equal({1=>2,3=>4,5=>6}, h)
+end
+
+assert 'Hash#select!' do
+ h = {1=>2,3=>4,5=>6}
+ hret = h.select!.with_index {|a,b| a[1] == 4}
+ assert_equal h, hret
+ assert_equal({3=>4}, h)
+end
+
assert 'Range#each' do
a = (1..5)
b = a.each
diff --git a/mrblib/hash.rb b/mrblib/hash.rb
index cd6ba8935..491d2a0ee 100644
--- a/mrblib/hash.rb
+++ b/mrblib/hash.rb
@@ -162,10 +162,12 @@ class Hash
# 1.9 Hash#select! returns Hash; ISO says nothing.
def select!(&b)
+ return to_enum :select! unless block_given?
+
keys = []
self.each_key{|k|
v = self[k]
- unless b.call(k, v)
+ unless b.call([k, v])
keys.push(k)
end
}
@@ -178,10 +180,12 @@ class Hash
# 1.9 Hash#select returns Hash; ISO says nothing.
def select(&b)
+ return to_enum :select unless block_given?
+
h = {}
self.each_key{|k|
v = self[k]
- if b.call(k, v)
+ if b.call([k, v])
h[k] = v
end
}