Project

General

Profile

Actions

Misc #10178

closed

refinements unactivated within refine block scope?

Added by why-capslock-though (Alexander Moore-Niemi) about 10 years ago. Updated about 10 years ago.

Status:
Closed
Assignee:
-
[ruby-core:64595]

Description

I doubt I am seeing a bug, but I was hoping someone could clarify for me the reason why I am seeing what I see. I tried pouring over the spec and wasn't quite able to pin it down.

My use case of refinements is not the normal one, so this is not high priority by any means.

But I am curious why, if I have defined a refinement in, say, module A, and then module B is using A, if B itself as a refine block, A's refinements will not be active within it.

So:

module A
  refine Time
  def weekday
    self.strftime("%A")
  end
end

module B
  using A
  puts Time.now.weekday # 1
  refine ActiveSupport::Time
  def method_missing(method, *args)
    puts Time.now.weekday # 2
    self.to_time.send(method.to_sym, args.first)
  end
  puts Time.now.weekday # 3
end

1 and 3 will be defined, but 2 will not. Is it because according to:
"The scope of a refinement is lexical in the sense that, when control is transferred outside the scope (e.g., by an invocation of a method defined outside the scope, by load/require, etc...), the refinement is deactivated."
refine transfers control outside the scope of the module, so no matter where I put using, it will not have the refinements of A active?

I apologize for my ignorance and greatly appreciate your answers on this matter.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0