Config来自哪里?

时间:2013-05-11 15:12:33

标签: ruby

任何人都可以解释一下Config在哪里。 RbConfig,来自NilClass f.E. ?

irb> NilClass::Config      # RbConfig
irb> NilClass.constants    # [] ??

更新: 无法找出这里如何应用继承。为什么我可以使用Object的子类访问顶级常量但是无法通过调用constants方法获取其符号?

1 个答案:

答案 0 :(得分:2)

这是一个顶级常数。您可以通过另一个模块访问它,但它实际上并不存在。 Class::RbConfigFixnum::RbConfig等都可以正常工作,但常数本身只能生活在最高层。

您可以在Object.constants找到它。 Object::RbConfig是引用它的唯一完全限定方式,不会导致“Module ::”警告引用的“顶层常量”。

编辑:通常情况下,继承的常量执行会显示在.constants的值中,但Object中的那些似乎被排除在外:

irb(main):001:0> Object.constants
=> [:Object, :Module, :Class, :BasicObject, :Kernel, :NilClass, :NIL, :Data, :TrueClass, :TRUE, :FalseClass, :FALSE, :Encoding, :Comparable, :Enumerable, :String, :Symbol, :Exception, :SystemExit, :SignalException, :Interrupt, :StandardError, :TypeError, :ArgumentError, :IndexError, :KeyError, :RangeError, :ScriptError, :SyntaxError, :LoadError, :NotImplementedError, :NameError, :NoMethodError, :RuntimeError, :SecurityError, :NoMemoryError, :EncodingError, :SystemCallError, :Errno, :ZeroDivisionError, :FloatDomainError, :Numeric, :Integer, :Fixnum, :Float, :Bignum, :Array, :Hash, :ENV, :Struct, :RegexpError, :Regexp, :MatchData, :Marshal, :Range, :IOError, :EOFError, :IO, :STDIN, :STDOUT, :STDERR, :ARGF, :FileTest, :File, :Dir, :Time, :Random, :Signal, :Process, :Proc, :LocalJumpError, :SystemStackError, :Method, :UnboundMethod, :Binding, :Math, :GC, :ObjectSpace, :Enumerator, :StopIteration, :RubyVM, :Thread, :TOPLEVEL_BINDING, :ThreadGroup, :Mutex, :ThreadError, :Fiber, :FiberError, :Rational, :Complex, :RUBY_VERSION, :RUBY_RELEASE_DATE, :RUBY_PLATFORM, :RUBY_PATCHLEVEL, :RUBY_REVISION, :RUBY_DESCRIPTION, :RUBY_COPYRIGHT, :RUBY_ENGINE, :ARGV, :Gem, :RbConfig, :Config, :CROSS_COMPILING, :Exception2MessageMapper, :IRB, :RubyToken, :RubyLex, :Readline, :Date]
irb(main):002:0> class Parent < Object; Answer = 42; end
=> 42
irb(main):003:0> class Child < Parent; end
=> nil
irb(main):004:0> Child.constants
=> [:Answer]

您可能希望阅读有关Ruby中常量查找的this article。这段话似乎很有用:

  

Ruby假设您将模块混合到继承的东西中   来自Object。因此,如果当前打开的模块是一个模块,它也将是   将Object.ancestors添加到查找链,以便顶级常量   按预期工作。