Мне нравится проверять вещи с помощью Pry, если я загружаю код в консоль pry, я получаю:
1) Ваш класс - это Модуль
[2] pry(main)> PingPacket::MessageType.class
=> Module
Если я зайду внутрькласс, который я получаю:
[4] pry(main)> cd PingPacket::MessageType
[5] pry(PingPacket::MessageType):1> ls
constants:
CHECK_IN LOCATE_REQUEST MOVING RESTING SYSTEM_TEST
EVENT LOW_BATTERY REPORT SOS
PingPacket::MessageType.methods: descriptor lookup resolve
locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_
Затем я могу проверить все константы:
[6] pry(PingPacket::MessageType):1> constants
=> [:CHECK_IN,
:SOS,
:RESTING,
:MOVING,
:EVENT,
:SYSTEM_TEST,
:REPORT,
:LOW_BATTERY,
:LOCATE_REQUEST]
Наконец, я могу получить значение констант из модуля с этим трюком:
[9] pry(PingPacket::MessageType):1> constants(false).map &method(:const_get)
=> [3, 4, 5, 6, 7, 8, 0, 1, 2]
Таким образом, это подойдет
[12] pry(main)> PingPacket::MessageType.constants(false).map &PingPacket::MessageType.method(:const_get)
=> [3, 4, 5, 6, 7, 8, 0, 1, 2]
Также ypu может видеть три метода, которые работают следующим образом:
[31] pry(PingPacket::MessageType):1> resolve :CHECK_IN
=> 3
[33] pry(PingPacket::MessageType):1> lookup 3
=> :CHECK_IN
[37] pry(PingPacket::MessageType):1> descriptor.each do |i|
[37] pry(PingPacket::MessageType):1* puts i
[37] pry(PingPacket::MessageType):1* end
LOCATE_REQUEST
SOS
SYSTEM_TEST
LOW_BATTERY
EVENT
CHECK_IN
RESTING
MOVING
REPORT
=> nil
проверьте, например, это:
[42] pry(PingPacket::MessageType):1> descriptor.each do |i|
[42] pry(PingPacket::MessageType):1* puts resolve i
[42] pry(PingPacket::MessageType):1* end
2
4
8
1
7
3
5
6
0
=> nil
наконец, объединив все вместе, давайте поместим все значения ключей в хеш
[54] pry(main)> Hash[PingPacket::MessageType.descriptor.collect do |i| [i, PingPacket::MessageType.resolve(i)] end]
=> {:LOCATE_REQUEST=>2,
:SOS=>4,
:SYSTEM_TEST=>8,
:LOW_BATTERY=>1,
:EVENT=>7,
:CHECK_IN=>3,
:RESTING=>5,
:MOVING=>6,
:REPORT=>0}