【发布时间】:2019-03-31 12:00:07
【问题描述】:
我想在 ruby 中创建自己的动态数组类(作为培训)。 这个想法是有一个类 DynamicArray ,它有一个容量(它在给定时刻可以容纳的元素数量)、一个大小(在给定时刻实际推入数组中的元素数量)和一个 static_array ,它是一个固定大小的静态整数数组。每当这个 static_array 已满时,我们将创建一个容量是原始 static_array 两倍的新静态数组,并复制新 static_array 中的每个元素。 由于 ruby 中没有静态数组,我的想法是使用 FFI https://github.com/ffi/ffi。在 c 中创建一个函数,该函数创建一个大小为 n 的静态 int 数组,然后能够在我的 ruby 程序中使用它。 我对 C 知之甚少,很难理解 FFI 的文档 这是我目前所拥有的,一个 create_array.c 文件,它定义了我的 c 函数来创建一个数组。
#include<stdio.h>
int * createArray ( int size )
{
int array[size];
return 0;
}
create_array.h 文件(根据我对 FFI 的理解,您需要将 c 函数放入 c 库中。):
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
你能解释一下我应该怎么做才能完成这项工作吗?
【问题讨论】:
-
我不确定这是一个好的用例,但是为了让我们更清楚地了解您的代码要做什么,您能为您的方法编写一些单元测试吗?
-
基本上,只要数组 (A) 已满,我的动态数组类就会将数组容量加倍。所以 add 是向 A 添加一个元素。 Resize_array 正在创建一个容量是 A 两倍的新静态数组。然后它将所有元素从 A 复制到 new_arr 并将影响 new_arr 到 A。 create_array 是创建 static_array 的 C 函数n 个整数类型的元素。感谢 FFI,我想将 create_array 导入到我的 ruby 程序中
-
@lacostenycoder 我尝试添加更多信息,如果仍然不清楚,请告诉我
-
@DavidGeismar 您正在尝试使用带有
ffi_lib的头文件。相反,您需要使用该函数传递一个共享库。 -
您不一定需要使用FFI(我不太清楚那是什么BTW);你可以做的是子类 Array 和添加/覆盖函数以满足 DynamicArray 的要求!??