Project

General

Profile

Actions

Bug #13358

closed

OpenStruct overriding allocate

Added by sitter (Harald Sitter) about 7 years ago. Updated over 6 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]
[ruby-core:80292]

Description

In https://github.com/ruby/ruby/commit/15960b37e82ba60455c480b1c23e1567255d3e05 OpenStruct gained

  class << self # :nodoc:
    alias allocate new
  end

Which is rather severely conflicting with expected behavior as Class.allocate is meant to not call initialize. So, in fact, the change made allocate of OpenStruct do what allocate is asserting not to do :-/

For OpenStruct itself that isn't that big a deal, for classes inheriting from OpenStruct it breaks allocate though.

Example:

require 'ostruct'

class A < OpenStruct
  def initialize(x, y = {})
    super(y)
  end
end

A.allocate

As allocate is alias'd to new in OpenStruct this will attempt to initialize A which will raise an ArgumentError because A cannot be initialized without arguments.

$ ruby x.rb
x.rb:4:in `initialize': wrong number of arguments (given 0, expected 1..2) (ArgumentError)
        from x.rb:9:in `new'
        from x.rb:9:in `<main>'

OpenStruct at the very least should document the fact that its allocate is behaving differently.
Ideally, OpenStruct should not alias allocate at all.


Files

0001-ostruct.rb-improve-fix-for-OpenStruct.allocate-respo.patch (1.19 KB) 0001-ostruct.rb-improve-fix-for-OpenStruct.allocate-respo.patch Proposed fix for OpenStruct#respond_to_missing? Eregon (Benoit Daloze), 03/28/2017 08:41 AM

Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #11884: Psych.load broken for OpenStruct in Ruby 2.3.0Closedmarcandre (Marc-Andre Lafortune)Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0