【发布时间】:2010-10-03 11:13:41
【问题描述】:
在 Matlab 中,我记得能够声明一个数组并对其进行初始化,并且它在整个 Matlab 会话期间驻留在内存中。我可以复制、修改它并通过测试运行它。这个选项在 Ruby 中可用吗?基本上,我想创建并填充一个由 1200 万个 32 位整数组成的数组。然后我想运行访问该内存的代码。我不想每次调整/调试我的 ruby 代码时都重新初始化该数组。
【问题讨论】:
在 Matlab 中,我记得能够声明一个数组并对其进行初始化,并且它在整个 Matlab 会话期间驻留在内存中。我可以复制、修改它并通过测试运行它。这个选项在 Ruby 中可用吗?基本上,我想创建并填充一个由 1200 万个 32 位整数组成的数组。然后我想运行访问该内存的代码。我不想每次调整/调试我的 ruby 代码时都重新初始化该数组。
【问题讨论】:
如果您使用的是交互式 ruby 控制台 (irb),那么您可以声明一个包含您的数据的全局变量。
$my_data = [1,2,3,4,5,6.....12000000]
然后在您选择的文本编辑器中处理您的代码并要求它进入您的 irb 会话。 这会让你按照你想要的方式工作。
【讨论】:
全局变量是一种方式,但我会说有点麻烦。
这意味着您希望对象持久化,因为您希望它在修改代码时可用。然后,您需要初始化数据并将其保存在文件中。您有多种可能性,例如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
【讨论】:
我假设对于会话,您的意思是一个开放的 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 程序来初始化数据,然后循环等待其他文件中的更改,再次加载它们并调用它们的函数。
【讨论】:
只需创建一个数组并引用它。就那么简单。您应该如何以及在何处创建此数组取决于您的代码。我会说常量最有意义,因为数组是常量,而不是变量。
THE_ARRAY = []
将数字添加到THE_ARRAY,然后使用它。 THE_ARRAY 是一个指针,所以当你调用它时,Ruby 每次都会从同一个内存位置获取同一个数组。
【讨论】: