Project

General

Profile

Bug #15278

Refinements don't work well with Forwardable

Added by chucke (Tiago Cardoso) 4 months ago. Updated 4 months ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:89687]

Description

Refined methods become unreachable when called through def_delegator.

require "forwardable"

module URIExtensions
  refine URI::Generic do
    def authority
      port_string = port == default_port ? nil : ":#{port}"
      "#{host}#{port_string}"
    end

    def origin
      "#{scheme}://#{authority}"
    end
  end
end

using URIExtensions

class Container
  extend Forwardable
  def_delegator :@uri, :origin
  def_delegator :@uri, :authority

  def initialize(uri)
    @uri = uri
  end
end


u = URI("https://google.com")
container = Container.new(u)
puts container.origin
puts container.authority

History

Updated by matz (Yukihiro Matsumoto) 4 months ago

  • Status changed from Open to Closed

It's intentional. Refinement is lexical overriding of methods. That means refined methods (e.g. origin in this case) are not called from delegators.

Matz.

Also available in: Atom PDF