【问题标题】:How do you access the symbol table in Ruby?如何访问 Ruby 中的符号表?
【发布时间】:2010-10-04 22:51:21
【问题描述】:

有没有办法在 Ruby 中访问符号表中的所有内容?我希望能够序列化或以其他方式保存程序运行的当前状态。为此,我似乎需要能够遍历范围内的所有变量。

【问题讨论】:

  • 如果你不介意我问,你用这个做什么?
  • 我正在使用它:stackoverflow.com/questions/199603/… 基本上,没有人回答我的问题足够好,所以在提供赏金(这会让我失去代表)之前,我想我会打破它进入这个子问题并自己找出答案。

标签: ruby serialization symbols


【解决方案1】:

我认为他来自 perl 背景,他想获取脚本中定义的所有变量并序列化它们。这样,当他加载文件时,他会取回它们。 我仍在搜索如何获取变量列表,但将使用 Marshal.dump 进行序列化,并使用 Marshal.load 进行读取。一旦我知道如何获取所有已定义变量的列表,我将编辑这篇文章。

编辑:找到了!

您可以通过调用这些方法获取所有变量的列表:

local_variables global_variables

如果您还没有序列化代码,我建议您这样做:

  • 创建一个包含变量名和变量值的类或 Struct 实例,并将它们添加到数组中:
local_variables.each {|var| my_array &lt&lt 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

【讨论】:

  • 注意:您必须在循环外初始化 my_array,因此当您遍历 local_variables 时它会被包含在内。您应该在右大括号之前添加“除非 var == 'my_array'”以忽略它。
【解决方案2】:

如果我正确理解了您的问题 - 您希望查看程序中的所有符号,那么以下方法应该可以解决问题:

puts Symbol.all_symbols.inspect

“all_symbols”类方法将返回程序中当前每个符号的数组。

【讨论】:

  • 是的,这是真的。有趣的是,它还返回未定义的符号:ZZZ 未定义。 ZZZ;Symbol.all_symbols 包括 ZZZ
  • @BSeven “有趣的是,它返回的符号也未定义”实际上没有。尝试调用ZZZ 的行为就像调用self.class.const_get(:ZZZ)(其中selfmain object)。 ZZZ 符号是在该过程中创建的,即使随后的 const_get 失败。
  • @BSeven 我在尝试使用Symbol.all_symbols.include?(:foo) 查找符号表中是否已存在符号时遇到了类似的问题。自然,仅提及:foo 就会创建它,因此它总是评估为假。您可以使用 Symbol.all_symbols.find { |sym| sym.to_s == "foo" } 之类的方法解决它
【解决方案3】:

我不相信有,但您始终可以使用marshall dump/load。

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 2011-01-15
    • 2014-10-21
    • 2016-11-24
    • 2017-08-21
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多