【问题标题】:Is variable permanence available in Ruby?Ruby 中是否提供变量持久性?
【发布时间】:2010-10-03 11:13:41
【问题描述】:

在 Matlab 中,我记得能够声明一个数组并对其进行初始化,并且它在整个 Matlab 会话期间驻留在内存中。我可以复制、修改它并通过测试运行它。这个选项在 Ruby 中可用吗?基本上,我想创建并填充一个由 1200 万个 32 位整数组成的数组。然后我想运行访问该内存的代码。我不想每次调整/调试我的 ruby​​ 代码时都重新初始化该数组。

【问题讨论】:

    标签: ruby arrays memory


    【解决方案1】:

    如果您使用的是交互式 ruby​​ 控制台 (irb),那么您可以声明一个包含您的数据的全局变量。

    $my_data = [1,2,3,4,5,6.....12000000]

    然后在您选择的文本编辑器中处理您的代码并要求它进入您的 irb 会话。 这会让你按照你想要的方式工作。

    【讨论】:

      【解决方案2】:

      全局变量是一种方式,但我会说有点麻烦。

      这意味着您希望对象持久化,因为您希望它在修改代码时可用。然后,您需要初始化数据并将其保存在文件中。您有多种可能性,例如YAML/JSON,或者以二进制但更有效的方式,Marshalling

      如果你有一个数据结构,你可以用这个把它保存在 YAML 中

      require "yaml"
      
      foo = SomeObject.new
      File.open("bar.yaml", "w") do |fh|
        YAML.dump(foo, fh)
      end
      

      JSON 几乎相同。使用 Marshal.dump 是等效的。

      然后你可以在你的代码中有一个读取数据的方法。

      File.open(fname) do |fh|
        foo = YAML.load(fh)
      end
      

      【讨论】:

        【解决方案3】:

        我假设对于会话,您的意思是一个开放的 irb(交互式红宝石),但这个建议不限于此。

        首先要做的是初始化数据。将数据存储为全局变量还是作为参数传递的本地变量并不重要,因为 ruby​​ 将参数作为引用传递。当您更改处理数据的代码时,您应该使用 'load' 语句而不是 'require',因为 load 会强制 ruby​​ 再次解析文件。

        例如,假设您已在 irb 中初始化数据

        > data = (1..120).to_a
        => [1, 2, ...]
        

        (请注意,irb 将数组打印到 shell,因此初始化一个大数组会为您提供很多在屏幕上运行的数字。) 您的代码在名为 loadable.rb 的文件中使用该数据

        def some_number(data)
          data[100]
        end
        

        现在您可以将该文件加载到 irb 并调用该函数。

        > require 'loadable'
        => true
        > some_number(data)
        => 101
        

        当您将 loadable.rb 中的代码更改为(比如说)返回条目 10 而不是 100,重新加载文件并再次调用该函数时,您将得到不同的 require 和 load 结果。

        > require 'loadable'
        => false
        > some_number(data)
        => 101
        

        使用 require,您会得到旧的(错误的)结果。

        > load 'loadable.rb'
        => true
        > some_number(data)
        => 11
        

        通过加载,您可以获得所需的结果。请注意,您需要使用完整的文件名调用 load,包括“.rb”。

        即使没有 irb,您也可以做到这一点,方法是使用一个 ruby​​ 程序来初始化数据,然后循环等待其他文件中的更改,再次加载它们并调用它们的函数。

        【讨论】:

          【解决方案4】:

          只需创建一个数组并引用它。就那么简单。您应该如何以及在何处创建此数组取决于您的代码。我会说常量最有意义,因为数组是常量,而不是变量。

          THE_ARRAY = []
          

          将数字添加到THE_ARRAY,然后使用它。 THE_ARRAY 是一个指针,所以当你调用它时,Ruby 每次都会从同一个内存位置获取同一个数组。

          【讨论】:

            猜你喜欢
            • 2011-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-03
            • 2020-06-21
            • 2010-11-12
            相关资源
            最近更新 更多