[#28015] RCR: RUBY_VERSION_INT — Roger Pack <rogerdpack2@...>

Situation:

14 messages 2010/02/02

[#28113] [Bug #2723] $: length affects re-require time of already loaded files — Greg Hazel <redmine@...>

Bug #2723: $: length affects re-require time of already loaded files

16 messages 2010/02/08

[#28151] [Bug #2739] ruby 1.8.7 built with pthreads hangs under some circumstances — Joel Ebel <redmine@...>

Bug #2739: ruby 1.8.7 built with pthreads hangs under some circumstances

31 messages 2010/02/11

[#28188] [Bug #2750] build fails on win32/MinGW: "executable host ruby is required." even when --with-baseruby is used — Christian Bodt <redmine@...>

Bug #2750: build fails on win32/MinGW: "executable host ruby is required." even when --with-baseruby is used

9 messages 2010/02/16

[#28206] Is Math module a wrapper of libm? — Yusuke ENDOH <mame@...>

Hi matz --

23 messages 2010/02/18
[#28212] Re: Is Math module a wrapper of libm? — Yukihiro Matsumoto <matz@...> 2010/02/18

Hi,

[#28219] Re: Is Math module a wrapper of libm? — Yusuke ENDOH <mame@...> 2010/02/18

Hi,

[#28225] Re: Is Math module a wrapper of libm? — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2010/02/18

Hi,

[#28233] Re: Is Math module a wrapper of libm? — Kenta Murata <muraken@...> 2010/02/18

Hi,

[#28265] Re: Is Math module a wrapper of libm? — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2010/02/20

Hi,

[#28286] Re: Is Math module a wrapper of libm? — Kenta Murata <muraken@...> 2010/02/21

Hi

[#28291] Re: Is Math module a wrapper of libm? — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2010/02/22

Hi!

[#28235] [Feature #2759] Regexp /g and /G options — Michael Fellinger <redmine@...>

Feature #2759: Regexp /g and /G options

35 messages 2010/02/18

[#28329] [ANN] Ruby 1.9.2dev has passed RubySpec! — Yusuke ENDOH <mame@...>

Hi,

12 messages 2010/02/24

[#28355] [ANN] Toward rich diversity of Ruby development. — Urabe Shyouhei <shyouhei@...>

A short announcement: thanks to some helps of GitHub people, I now have

12 messages 2010/02/27

[#28365] Indentifying key MRI-on-Windows issues — Jon <jon.forums@...>

In an effort to begin summarizing key MRI-on-Windows open issues I'm starting this thread in hopes that those interested will respond with details on the key MRI issues they feel need resolution for Windows users.

11 messages 2010/02/27
[#28690] Re: Indentifying key MRI-on-Windows issues — Roger Pack <rogerdpack2@...> 2010/03/16

> My key concern is http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-=

[ruby-core:28157] [Feature #2740] Extend const_missing to pass in the nesting

From: Kornelius Kalnbach <redmine@...>
Date: 2010-02-12 17:17:23 UTC
List: ruby-core #28157
Issue #2740 has been updated by Kornelius Kalnbach.


> In order to achieve this, I propose that we extend the const_missing
> method to take an optional second parameter containing the nesting:
> 
>     class Foo
>       class Bar
>         def self.const_missing(id, nesting)
>           id == :Baz
>           nesting == [Foo::Bar] # first case
>           nesting == [Foo::Bar, Foo] # second case
>         end
>       end
>     end
> 
> This would allow people who wish to do their own custom constant
> loading (such as Rails) to do so in a way that is consistent with Ruby's
> own constant lookup. In order to avoid backward-compatibility issues, we
> can check the arity of the const_missing method, and only pass in the
> nesting if a second parameter was provided.
Interesting idea. However, I see two problems with the proposal:

1. It changes the const_missing API, breaking code. It would be nice to 
   find a way around this.

2. The feature Module.nesting is dependent on the "point of the call".
   As you described, const_missing is not. I'm not sure about the 
   implications; Module.nesting is defined in eval.c, while 
   const_missing and const_get are defined in variable.c.

There may be another way around this. method_missing makes it possible to use Ruby's inheritance chain again by calling super. So, what if we just follow the constant lookup nesting chain again when const_missing didn't return anything?

You wouldn't even have to write the logic yourself. The implementation could look something like this:

  class Module
    # classic-style const_missing
    def const_missing(id)
      namespace = "#{name}::" unless self == Object
      puts "Searching for #{namespace}#{id}..."
      nil
    end
  end

  class Module
    # new-style constant lookup, given nesting
    # This would have to be implemented in C.
    def const_get2 id, nesting
      nesting += [Object]  # Don't forget top level.
      # As usual: Try to find existing constant (without const_missing).
      for mod in nesting
        # imitating constant lookup without const_missing
        if mod.constants.map { |c| c.to_sym }.include? id.to_sym
          return mod.const_get(id)
        end
      end
      # New style: Call const_missing on each nesting level.
      for mod in nesting
        value = mod.const_missing id
        return value if value
      end
      # As usual: Raise NameError if nothing was found.
      raise NameError, "uninitialized constant #{name}::#{id}"
    end
  end

  class Foo
    class Bar
      const_get2(:Baz, Module.nesting)
      # >> Searching for Foo::Bar::Baz...
      # >> Searching for Foo::Baz...
      # >> Searching for Baz...
      #~> uninitialized constant Foo::Bar::Baz (NameError)
    end
  end

  class Foo::Bar
    const_get2(:Baz, Module.nesting)
    # >> Searching for Foo::Bar::Baz...
    # >> Searching for Baz...
    #~> uninitialized constant Foo::Bar::Baz (NameError)
  end

This solves 1., but not 2. Calling const_get and would still depend on Module.nesting.

Also, a constant with a value of nil or false would be interpreted as "not found". Maybe we could define a protocol for this, something like StopIteration?

  NoConstantError = Class.new NameError

  class Module
    def const_missing(id)
      ...
      raise NoConstantError
    end
  end

  class Module
    def const_get2 id, nesting
      ...
      for mod in nesting
        begin
          return mod.const_missing(id)
        rescue NoConstantError
          # continue
        end
      end
      ...
    end
  end

On the other hand, maybe implicit constant lookup through the module nesting *and* automatic loading is a bit too much ;-)
----------------------------------------
http://redmine.ruby-lang.org/issues/show/2740

----------------------------------------
http://redmine.ruby-lang.org

In This Thread