From: hanmac@... Date: 2018-09-03T09:07:09+00:00 Subject: [ruby-core:88818] [Ruby trunk Bug#15027] When Struct#each method is overriden Struct#select and Struct#to_a use wrong collections Issue #15027 has been updated by Hanmac (Hans Mackowiak). @matz: is the patch from Nobu good enough? ---------------------------------------- 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-73863 * 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) struct_enumerable_fix2.patch (1.51 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: