Как получить доступ к таблице символов в Ruby?

Есть ли способ получить доступ ко всему в таблице символов в Ruby? Я хочу иметь возможность сериализовать или иным образом сохранять текущее состояние запуска программы. Для этого, кажется, мне нужно иметь возможность перебирать все переменные в области видимости.


person Jonathan Tran    schedule 02.02.2009    source источник
comment
Если вы не возражаете, я спрошу, для чего вы это используете?   -  person Geo    schedule 02.02.2009
comment
Я использую его для этого: stackoverflow.com/questions/199603/ По сути, никто не ответил на мой вопрос достаточно хорошо, поэтому, прежде чем предлагать награду (из-за которой я потеряю репутацию), я подумал, что разобью его на этот подвопрос и сам разберусь с ответом.   -  person Jonathan Tran    schedule 03.02.2009


Ответы (3)


Я думаю, что он имеет опыт работы с Perl и хотел бы получить все переменные, определенные в сценарии, и сериализовать их. Таким образом, когда он загрузит файл, он получит их обратно. Я все еще ищу, как получить список переменных, но сериализация будет выполняться с использованием Marshal.dump, а их обратное чтение будет выполняться с помощью Marshal.load. Я отредактирую сообщение, как только узнаю, как получить список всех определенных переменных.

РЕДАКТИРОВАТЬ: нашел!

Вы можете получить список всех переменных, вызвав эти методы:

local_variables
global_variables

И если у вас еще нет кода сериализации, я бы предложил что-то вроде этого:

  • создайте класс или экземпляр Struct, который содержит имя переменной и значение переменной, и добавьте их в массив:

local_variables.each {|var| my_array << MyVarObject.new(var,eval(var)) } # eval is used to get the value of the variable

а затем сериализовать массив:


data = Marshal.dump(my_array)
File.open("myfile.ser","w") do |file|
  file.puts data
end
person Geo    schedule 02.02.2009
comment
Будьте осторожны: вы должны инициализировать my_array вне цикла, и в результате он будет включен, когда вы перебираете local_variables. Вы должны добавить, если var == 'my_array' непосредственно перед закрывающей фигурной скобкой, чтобы игнорировать его. - person Bkkbrad; 03.02.2009

Если я правильно понял ваш вопрос - вы хотели бы видеть все символы в своей программе, то следующее должно помочь:

puts Symbol.all_symbols.inspect

Метод класса all_symbols вернет массив всех символов, находящихся в данный момент в программе.

person andHapp    schedule 02.02.2009
comment
Да, это правда. Интересно, что он возвращает символы, которые также не определены: ZZZ не определено. ZZZ;Symbol.all_symbols включает ZZZ. - person B Seven; 07.07.2015
comment
@BSeven Интересно, что он возвращает символы, которые также не определены. На самом деле это не так. Простое действие попытки вызова ZZZ похоже на вызов self.class.const_get(:ZZZ) (где self — это main объект). В этом процессе создается символ ZZZ, даже если последующий const_get терпит неудачу. - person Alexander; 17.03.2021
comment
@BSeven Я столкнулся с аналогичной проблемой, когда пытался найти, существует ли уже символ в таблице символов с помощью Symbol.all_symbols.include?(:foo). Естественно, простое упоминание :foo создает его, так что всегда оценивается как false. Вы можете обойти это с помощью чего-то вроде Symbol.all_symbols.find { |sym| sym.to_s == "foo" } - person Alexander; 17.03.2021

Я не верю, что есть, но вы всегда можете использовать marshall дамп/загрузка.

person Allyn    schedule 02.02.2009