1
任何人都可以解释Config,resp。 RbConfig来自NilClass f.E. ?Config来自哪里?
irb> NilClass::Config # RbConfig
irb> NilClass.constants # [] ??
更新: 无法找到如何在这里应用的继承。为什么我可以使用Object的子类访问顶级常量,但无法通过调用constants
方法获取它的符号?
任何人都可以解释Config,resp。 RbConfig来自NilClass f.E. ?Config来自哪里?
irb> NilClass::Config # RbConfig
irb> NilClass.constants # [] ??
更新: 无法找到如何在这里应用的继承。为什么我可以使用Object的子类访问顶级常量,但无法通过调用constants
方法获取它的符号?
这是一个顶级常量。您可以通过另一个模块访问它,但实际上并不在那里。 Class::RbConfig
,Fixnum::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]
您不妨阅读this article约在不断查找红宝石。这段看起来是相关的:
Ruby假定你将模块混合成Object继承 的东西。因此,如果当前打开的模块是一个模块,它也将 添加Object.ancestors到查找链,以便顶级常量 按预期工作。
感谢您的回答。但是,如何在这里应用继承?为什么我可以通过子类访问这样的常量(在这种情况下,NilClass是Object的子类),但是不能通过发送'常量'方法或其他等价物来获得它的符号? – Torimus 2013-05-11 16:19:47
这不是继承,它只是一个命名空间的快捷方式; Ruby允许您访问顶级名称,就好像它们是任何其他名称空间的一部分一样。否则,无论何时您在类或模块定义中进行编码,您都必须限定所有顶级类名称:':: File.exists?'等等。 – 2013-05-11 17:04:25
对外部模块名称空间的非限定访问似乎有点令人困惑。也感谢这个链接,我现在正在阅读它。如果它能满足我的问题,我会将你的答案标记为已接受。 – Torimus 2013-05-11 19:43:56