diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-07-13 18:05:01 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-07-13 18:05:01 +0900 |
| commit | b4cdced22fe1f25d8cf6fc499a2e2c9875f17e9e (patch) | |
| tree | 44697631bb10ae64c9b35cd83beac582f18d4fca | |
| parent | a9fd2e646492699894d33eaf3de7336356ce6726 (diff) | |
| download | mruby-b4cdced22fe1f25d8cf6fc499a2e2c9875f17e9e.tar.gz mruby-b4cdced22fe1f25d8cf6fc499a2e2c9875f17e9e.zip | |
`Enumerable#detect` {and `#find`} should call `ifnone`; fix #4484
It's an error in ISO specification; 15.3.2.2.4 and 15.3.2.2.7
| -rw-r--r-- | mrblib/enum.rb | 16 | ||||
| -rw-r--r-- | test/t/enumerable.rb | 4 |
2 files changed, 9 insertions, 11 deletions
diff --git a/mrblib/enum.rb b/mrblib/enum.rb index 9bd74e1c4..fe40b4d27 100644 --- a/mrblib/enum.rb +++ b/mrblib/enum.rb @@ -65,22 +65,20 @@ module Enumerable end ## - # Call the given block for each element - # which is yield by +each+. Return - # +ifnone+ if no block value was true. - # Otherwise return the first block value - # which had was true. + # Return the first element for which + # value from the block is true. If no + # object matches, calls +ifnone+ and + # returns its result. Otherwise returns + # +nil+. # # ISO 15.3.2.2.4 def detect(ifnone=nil, &block) - ret = ifnone self.each{|*val| if block.call(*val) - ret = val.__svalue - break + return val.__svalue end } - ret + ifnone.call unless ifnone.nil? end ## diff --git a/test/t/enumerable.rb b/test/t/enumerable.rb index 652c304da..9e7602db7 100644 --- a/test/t/enumerable.rb +++ b/test/t/enumerable.rb @@ -45,7 +45,7 @@ end assert('Enumerable#detect', '15.3.2.2.4') do assert_equal 1, [1,2,3].detect() { true } - assert_equal 'a', [1,2,3].detect("a") { false } + assert_equal 'a', [1,2,3].detect(->{"a"}) { false } end assert('Array#each_with_index', '15.3.2.2.5') do @@ -64,7 +64,7 @@ end assert('Enumerable#find', '15.3.2.2.7') do assert_equal 1, [1,2,3].find() { true } - assert_equal 'a', [1,2,3].find("a") { false } + assert_equal 'a', [1,2,3].find(->{"a"}) { false } end assert('Enumerable#find_all', '15.3.2.2.8') do |
