From: bryan@... Date: 2019-02-06T18:55:47+00:00 Subject: [ruby-core:91439] [Ruby trunk Bug#15591] SimpleDelegator: Undefined method when delegating a refined method Issue #15591 has been reported by bryanp (Bryan Powell). ---------------------------------------- Bug #15591: SimpleDelegator: Undefined method when delegating a refined method https://bugs.ruby-lang.org/issues/15591 * Author: bryanp (Bryan Powell) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: * Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- SimpleDelegator does not seem compatible with refinements (tested on 2.5.3 and 2.6.0). Here's an example: ``` ruby require "delegate" module SuperDuper refine Object do def super_duper puts "!" end end end class Result < SimpleDelegator; end using SuperDuper value = "" # Works fine. # value.super_duper # => ! # Breaks unexpectedly :( # Result.new(value).super_duper # => undefined method `super_duper' for "":Result (NoMethodError) ``` Creating my own naive delegator works as expected: ```ruby require "delegate" module SuperDuper refine Object do def super_duper puts "!" end end end class Result def initialize(value) @value = value end def method_missing(method, *args, &block) if @value.respond_to?(method) @value.public_send(method, *args, &block) else super end end end using SuperDuper value = "" # Works fine. # value.super_duper # => ! # Works fine. # Result.new(value).super_duper # => ! ``` Happy to work on fixing this, but first wanted to confirm that this is not expected behavior. Bryan P. -- https://bugs.ruby-lang.org/ Unsubscribe: