【问题标题】:Is it possible to narrow ruby constant lookup是否可以缩小红宝石常量查找范围
【发布时间】:2016-10-14 19:11:24
【问题描述】:

我有一个模块,其中包含名为 String 的类(以及其他类)。如果没有这样的类,我需要按名称查找类并优雅地退回。

module Mod1
  module String
  end
end 
Mod1.const_get 'String'
#⇒ Mod1::String
Kernel.const_get '::Mod1::String'
#⇒ Mod1::String

到目前为止,一切都很好。当我尝试查找不存在的类时,我预计会收到NameError,这很好。问题是如果有一个具有给定名称的类存在于全局命名空间中,它会被返回:

Mod1.const_get 'Fixnum'
#⇒ Fixnum < Integer
Kernel.const_get '::Mod1::Fixnum'
#⇒ Fixnum < Integer

我明白原因,但我的问题是:是否有一种开箱即用的方法可以仅在给定的命名空间中查找常量?

现在我检查结果

result.to_s.start_with?(namespace)

但这绝对不是缩小查找范围的最佳方式。

【问题讨论】:

    标签: ruby namespaces metaprogramming


    【解决方案1】:

    答案是:

    Mod1.const_get 'Fixnum', false
    

    这是文档:

    /*
     *  call-seq:
     *     mod.const_get(sym, inherit=true)    -> obj
     *     mod.const_get(str, inherit=true)    -> obj
     *
     *  Checks for a constant with the given name in <i>mod</i>.
     *  If +inherit+ is set, the lookup will also search
     *  the ancestors (and +Object+ if <i>mod</i> is a +Module+).
     *
     *  The value of the constant is returned if a definition is found,
     *  otherwise a +NameError+ is raised.
     *
     *     Math.const_get(:PI)   #=> 3.14159265358979
     *
     *  This method will recursively look up constant names if a namespaced
     *  class name is provided.  For example:
     *
     *     module Foo; class Bar; end end
     *     Object.const_get 'Foo::Bar'
     *
     *  The +inherit+ flag is respected on each lookup.  For example:
     *
     *     module Foo
     *       class Bar
     *         VAL = 10
     *       end
     *
     *       class Baz < Bar; end
     *     end
     *
     *     Object.const_get 'Foo::Baz::VAL'         # => 10
     *     Object.const_get 'Foo::Baz::VAL', false  # => NameError
     *
     *  If the argument is not a valid constant name a +NameError+ will be
     *  raised with a warning "wrong constant name".
     *
     *  Object.const_get 'foobar' #=> NameError: wrong constant name foobar
     *
     */
    

    https://github.com/ruby/ruby/blob/449fbfd4d4ce47be227804c22214fed32a5b0124/object.c#L2027

    【讨论】:

    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多