Ruby - 定数一覧取得!
Updated:
Ruby でプログラミング中に、どのような定数がどのような値で定義されているのか確認したいことがあります。
以下、備忘録です。
0. 前提条件
- Ruby 2.0.0-p247 での作業・動作確認を想定。
1. クラス内定義の定数をクラス内で確認
クラス(またはモジュール)内で定義した定数の一覧をそのクラス内で確認するには以下のようにする。
class Hoge
HOGE = "TEST_HOGE"
constants.each do |c|
puts "#{c} = #{const_get(c)}"
end
end
File: 実行結果
1
HOGE = TEST_HOGE
2. クラス内定義の定数をクラス外から確認
クラス(またはモジュール)内で定義した定数の一覧をそのクラスの外から確認するには以下のようにする。
class Hoge
HOGE = "TEST_HOGE"
end
Hoge.constants.each do |c|
puts "#{c} = #{Hoge.const_get(c)}"
end
File: 実行結果
1
HOGE = TEST_HOGE
3. 継承クラスと親クラスで定義された定数をクラス外から確認
継承クラスとその親クラスで定義された定数の一覧をそのクラスの外から確認するには以下のようにする。
class Hoge
HOGE = "TEST_HOGE"
end
class Fuga < Hoge
FUGA = "TEST_FUGA"
end
Fuga.constants.each do |c|
puts "#{c} = #{Fuga.const_get(c)}"
end
File: 実行結果
1
2
FUGA = TEST_FUGA
HOGE = TEST_HOGE
4. 継承クラスで定義された定数のみをクラス外から確認
継承クラスで定義された定数のみをそのクラスの外から確認するには以下のようにする。(親クラスで定義された定数は含めない)
constants(false)
とする。(デフォルトは constants(true)
となっている)
class Hoge
HOGE = "TEST_HOGE"
end
class Fuga < Hoge
FUGA = "TEST_FUGA"
end
Fuga.constants(false).each do |c|
puts "#{c} = #{Fuga.const_get(c)}"
end
File: 実行結果
1
FUGA = TEST_FUGA
5. 参照可能な全ての定数
参照可能な全ての定数の一覧を確認するには以下のようにする。
class Hoge
HOGE = "TEST_HOGE"
end
class Fuga < Hoge
FUGA = "TEST_FUGA"
end
Module.constants.sort.each do |c|
puts "#{c} = #{Module.const_get(c)}"
end
この場合、Hoge
クラス(Module.constants
の外側で定義のクラス(またはモジュール))も定数となるが、Hoge
クラス内で定義した定数 HOGE
は参照不可能。
File: 実行結果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
ARGF = ARGF
ARGV = []
ArgumentError = ArgumentError
Array = Array
BasicObject = BasicObject
Bignum = Bignum
Binding = Binding
CROSS_COMPILING =
Class = Class
Comparable = Comparable
Complex = Complex
get_constants_list.rb:38:in `const_get': Use RbConfig instead of obsolete and deprecated Config.
Config = RbConfig::Obsolete
Data = Data
Date = Date
Dir = Dir
ENV = ENV
EOFError = EOFError
Encoding = Encoding
EncodingError = EncodingError
Enumerable = Enumerable
Enumerator = Enumerator
Errno = Errno
Exception = Exception
FALSE = false
FalseClass = FalseClass
Fiber = Fiber
FiberError = FiberError
File = File
FileTest = FileTest
Fixnum = Fixnum
Float = Float
FloatDomainError = FloatDomainError
Fuga = Fuga
GC = GC
Gem = Gem
Hash = Hash
Hoge = Hoge
IO = IO
IOError = IOError
IndexError = IndexError
Integer = Integer
Interrupt = Interrupt
Kernel = Kernel
KeyError = KeyError
LoadError = LoadError
LocalJumpError = LocalJumpError
Marshal = Marshal
MatchData = MatchData
Math = Math
Method = Method
Module = Module
Mutex = Mutex
NIL =
NameError = NameError
NilClass = NilClass
NoMemoryError = NoMemoryError
NoMethodError = NoMethodError
NotImplementedError = NotImplementedError
Numeric = Numeric
Object = Object
ObjectSpace = ObjectSpace
Proc = Proc
Process = Process
RUBY_COPYRIGHT = ruby - Copyright (C) 1993-2013 Yukihiro Matsumoto
RUBY_DESCRIPTION = ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
RUBY_ENGINE = ruby
RUBY_PATCHLEVEL = 247
RUBY_PLATFORM = x86_64-linux
RUBY_RELEASE_DATE = 2013-06-27
RUBY_REVISION = 41674
RUBY_VERSION = 2.0.0
Random = Random
Range = Range
RangeError = RangeError
Rational = Rational
RbConfig = RbConfig
Regexp = Regexp
RegexpError = RegexpError
RubyVM = RubyVM
RuntimeError = RuntimeError
STDERR = #<IO:0x007f81045b6148>
STDIN = #<IO:0x007f81045b6238>
STDOUT = #<IO:0x007f81045b61c0>
ScriptError = ScriptError
SecurityError = SecurityError
Signal = Signal
SignalException = SignalException
StandardError = StandardError
StopIteration = StopIteration
String = String
Struct = Struct
Symbol = Symbol
SyntaxError = SyntaxError
SystemCallError = SystemCallError
SystemExit = SystemExit
SystemStackError = SystemStackError
TOPLEVEL_BINDING = #<Binding:0x007f81045afc58>
TRUE = true
Thread = Thread
ThreadError = ThreadError
ThreadGroup = ThreadGroup
Time = Time
TracePoint = TracePoint
TrueClass = TrueClass
TypeError = TypeError
UnboundMethod = UnboundMethod
ZeroDivisionError = ZeroDivisionError
その他
Object.constants
とすると、トップレベルの組み込み定数とクラス(またはモジュール)名が返ってくる。
(上記 5 のModule.constants
をObject.constants
に置き換えた場合は、同じ結果になる)const_get
でUse RbConfig instead of obsolete and deprecated Config.
とメッセージが出力される部分(Config
という定数)がある。
Object.constants
では、このメッセージは出力されない。
(今は、Ruby インストール時の情報はConfig
よりRbConfig
で取得するようだが、Module.const_get
とObject.const_get
の振る舞いの違い等も含めて不勉強で疎いので、詳細は不明)
参考サイト
ちょっとした記録のつもりでしたが、調べてみると意外と奥が深かったです。
以上。
Comments