2013-05-11 132 views
1

任何人都可以解釋Config,resp。 RbConfig來自NilClass f.E. ?Config來自哪裏?

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

更新: 無法找到如何在這裏應用的繼承。爲什麼我可以使用Object的子類訪問頂級常量,但無法通過調用constants方法獲取它的符號?

回答

2

這是一個頂級常量。您可以通過另一個模塊訪問它,但實際上並不在那裏。 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到查找鏈,以便頂級常量 按預期工作。

+0

感謝您的回答。但是,如何在這裏應用繼承?爲什麼我可以通過子類訪問這樣的常量(在這種情況下,NilClass是Object的子類),但是不能通過發送'常量'方法或其他等價物來獲得它的符號? – Torimus 2013-05-11 16:19:47

+0

這不是繼承,它只是一個命名空間的快捷方式; Ruby允許您訪問頂級名稱,就好像它們是任何其他名稱空間的一部分一樣。否則,無論何時您在類或模塊定義中進行編碼,您都必須限定所有頂級類名稱:':: File.exists?'等等。 – 2013-05-11 17:04:25

+0

對外部模塊名稱空間的非限定訪問似乎有點令人困惑。也感謝這個鏈接,我現在正在閱讀它。如果它能滿足我的問題,我會將你的答案標記爲已接受。 – Torimus 2013-05-11 19:43:56