Доступно ли переменное постоянство в Ruby? - PullRequest
1 голос
/ 26 января 2009

В Matlab я помню возможность объявить массив и инициализировать его, и он находится в памяти в течение всего сеанса Matlab. Я мог бы скопировать это, изменить это, и выполнить это через тесты. Эта опция доступна в Ruby? По сути, я хочу создать и заполнить массив из 12 миллионов 32-разрядных целых чисел. Затем я хочу запустить код, который обращается к этой памяти. Я не хочу повторной инициализации этого массива каждый раз, когда я настраиваю / отлаживаю свой код ruby.

Ответы [ 4 ]

3 голосов
/ 26 января 2009

Глобальная переменная - один из способов, но я бы сказал, что она немного громоздкая.

Это означает, что вы хотите, чтобы постоянство объектов было таким, каким вы хотите, чтобы оно было доступно для всех модификаций вашего кода. Затем вам нужно инициализировать ваши данные и сохранить их в файл. У вас есть несколько возможностей, например, 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 голосов
/ 26 января 2009

Если вы используете интерактивную консоль ruby ​​(irb), вы можете объявить глобальную переменную, содержащую ваши данные.

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

, затем в выбранном вами текстовом редакторе поработайте над своим кодом и включите его в сеанс irb. Это позволит вам работать так, как вы хотите.

0 голосов
/ 26 января 2009

Просто создайте массив и обратитесь к нему. Просто как тот. Как и где вы должны создать этот массив, зависит от вашего кода. Я бы сказал, что константа имеет смысл, потому что массив постоянный, а не переменный.

THE_ARRAY = []

Добавьте числа к THE_ARRAY, а затем используйте его. THE_ARRAY - это указатель, поэтому при вызове Ruby каждый раз получает один и тот же массив из одной и той же ячейки памяти.

0 голосов
/ 26 января 2009

Я предполагаю, что под сессией вы подразумеваете открытый irb (интерактивный рубин), но это предложение не ограничивается этим.

Первое, что нужно сделать, это инициализировать ваши данные. Не имеет значения, сохраняете ли вы данные как глобальную переменную или как локальную переменную, которую вы передаете в качестве параметров, потому что ruby ​​передает параметры как ссылки. Когда вы изменяете код, который работает с данными, вы должны использовать оператор «load» вместо «require», потому что load заставляет ruby ​​снова анализировать файл.

Например, допустим, вы инициализировали свои данные в вашем irb

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

(Обратите внимание, что irb выводит массив в оболочку, поэтому при инициализации большого массива вы получаете множество чисел, бегущих по экрану.) И ваш код, который использует эти данные в файле с именем 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, которая инициализирует данные, а затем ожидает изменений в других файлах в цикле, загружает их снова и вызывает их функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...