2009-01-25 5 views
1

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

ответ

3

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

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

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

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

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

0

Я полагаю, что с сеансом, вы имеете в виду открытый 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 'loadable' 
=> false 
> some_number(data) 
=> 101 

С требованием вы получите старый (неправильный) результат.

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

С грузом вы получаете желаемые результаты. Обратите внимание, что вам нужно вызвать нагрузку с полным именем файла, включая «.rb».

Вы можете сделать это даже без irb, имея одну рубиновую программу, которая инициализирует данные, а затем ждет изменений в других файлах в цикле, загружает их снова и вызывает их функции.

0

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

THE_ARRAY = [] 

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

Смежные вопросы