Issue #15027 has been updated by matz (Yukihiro Matsumoto).

Status changed from Open to Feedback

The proposed behavior is more consistent but slower. I am not sure it's a good idea to hinder performance by supporting consistency in the rare case. Any opinion?

Matz.


----------------------------------------
Bug #15027: When Struct#each method is overriden Struct#select and Struct#to_a use wrong collections
https://bugs.ruby-lang.org/issues/15027#change-73704

* Author: bruno (Bruno Sutic)
* Status: Feedback
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: 2.6.0dev
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
### Bug

Here's the code snippet that should reproduce the problem:

~~~ ruby
class Foo < Struct.new(:bar)
  def each(&block)
    [:baz, :qux].each(&block)
  end
end

foo = Foo.new(:foo)
foo.map(&:itself) # => [:baz, :qux]  # OK

foo.to_a # => [:foo]  # NOT OK, expected [:baz, :qux]
foo.select(&:itself) # => [:foo]  # NOT OK, expected [:baz, :qux]
~~~

As you can see, even tho we defined another collection for use by overriding `#each`, the `to_a` and `select` still use `Struct`'s original collection.

The problem seem to be with `Struct#to_a` and `Struct#select` methods from `struct.c` file that are defined unnecessarily.

### Proposed solution

The attached solution simply deletes `Struct#select` and `Struct#to_a`. A couple tests are added to show everything still works as before.

Please let me know if I can provide any more info and I'll be ready to do so.

---Files--------------------------------
struct_enumerable_fix.patch (2.8 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>