Project

General

Profile

Feature #12861

super in a block can be either lexically or dynamically scoped depending on how the block is invoked

Added by bughit (bug hit) over 4 years ago. Updated about 4 years ago.

Status:
Feedback
Priority:
Normal
Target version:
-
[ruby-core:77705]

Description

class Class1
  def self.foo
    'foo'
  end
  def self.method1
    'method1'
  end
end

class Class2 < Class1
  def self.foo
    bar do
      super()
    end
  end
  def self.bar(&block)
    a = block.()
    define_singleton_method :method1, &block
    b = send(:method1)
    c = block.()
    [a, b, c]
  end
end

p Class2.foo # ["foo", "method1", "foo"]

It doesn't seem like a good idea for a given language construct to be either lexically or dynamically scoped, depending on how its surrounding block is invoked (which is not visible at the point of definition). I think it would be better if super were always lexically scoped, and a different keyword (dynamic_super) were always dynamically scoped

Also available in: Atom PDF