Я хотел бы создать свой собственный класс динамического массива в ruby (в качестве тренинга).Идея состоит в том, чтобы иметь класс DynamicArray, который имеет емкость (число элементов, которые он может содержать в данный момент), размер (количество элементов, которые фактически были помещены в массив в данный момент) и static_array, который являетсястатический массив целых чисел фиксированного размера.Когда этот static_array заполнен, мы создадим новый статический массив с удвоенной емкостью исходного static_array и скопируем все элементы внутри нового static_array.Поскольку в ruby нет статического массива, моя идея заключалась в том, чтобы использовать FFI https://github.com/ffi/ffi. для создания функции в c, которая создает статический массив типа int размера n, и затем иметь возможность использовать его в моей программе ruby.У меня очень мало знаний о C, и мне трудно понять документ FFI. Вот что у меня есть, файл create_array.c, который определяет мою функцию c для создания массива.
#include<stdio.h>
int * createArray ( int size )
{
int array[size];
return 0;
}
aФайл create_array.h (из того, что я понял о FFI, вам нужно поместить ваши функции c в библиотеку ac.):
int * createArray ( int size )
, и это мой файл dynamic_array.rb, который будет делать что-то вроде этого:
require 'ffi'
class DynamicArray
extend FFI::Library
ffi_lib "./create_array.h"
attach_function :create_array, [:int], :int
def initialize
@size = 0
@capacity = 1
@current_index = 0
@static_array = create_array(@capacity)
end
def add(element)
@size += 1
resize_array if @size > @capacity
@static_array[@current_index] = element
@current_index += 1
end
private
def resize_array
@capacity = @capacity*2
new_arr = create_array(@capacity)
@static_array.each_with_index do |val, index|
new_arr[index] = val
end
@static_array = new_arr
end
end
Вот несколько тестов для добавления и изменения размера:
def test_add
dynamic_arr = DynamicArray.new
dynamic_arr.add(1)
dynamic_arr.add(2)
assert_equal(1, dynamic_arr.static_array[0])
assert_equal(2, dynamic_arr.static_array[1])
end
def test_resize_array
dynamic_arr = DynamicArray.new
dynamic_arr.add(1)
dynamic_arr.add(2)
assert_equal(2, dynamic_arr.capacity)
dynamic_arr.resize_array
assert_equal(4, dynamic_arr.capacity)
assert_equal
end
Не могли бы вы объяснить, что я должен сделать, чтобы сделать эту работу?