Вы делаете репликацию, или у Вас есть торговый персонал, который выполняет разъединенный databses, который должен объединиться, использовать GUID. Иначе я пошел бы для интервала или bigint. Они намного легче иметь дело с в конечном счете.
Stuff::test
не относится к типу Vectord
.
Однако , он относится к типу, который ведет себя точно так же, как Vectord
, что является наиболее важным вопросом для языка с утиной типизацией, такого как Ruby.
В вашем примере есть одна небольшая проблема. Заявление %import <stl_vector.i>
должно быть %include <stl_vector.i>
.
Правильный завершенный пример:
%module Stuff
%include "std_vector.i"
namespace std
{
%template(Vectord) vector<double>;
};
%inline%{
std::vector<double> test;
%}
Обёртка swig может быть сгенерирована с помощью
swig -ruby -c++ Stuff.i
И скомпилирована (с g ++) с помощью утверждение:
g++ Stuff_wrap.cxx -shared -fPIC -o Stuff.so -I /usr/lib/ruby/1.8/x86_64-linux/
jason@jason-VirtualBox:~$ irb
irb(main):001:0> require 'Stuff'
=> true
irb(main):003:0> Stuff::test.class
=> Array
Как мы видим, объект, возвращаемый Stuff::test
, имеет тип Array
. Однако, в отличие от обычного массива Ruby, этот массив может быть установлен только на значение, которое может быть преобразовано в std::vector<double>
irb(main):002:0> Stuff::test = [5,4,3]
=> [5, 4, 3]
irb(main):003:0> Stuff::test = [5.0, "5.0"]
TypeError: double
from (irb):3:in `test='
from (irb):3
from :0
Кроме того, он может быть преобразован непосредственно в и из std::vector<double>
объектов.
irb(main):002:0> vec = Stuff::Vectord.new()
=> std::vector<double,std::allocator< double > > []
irb(main):003:0> vec << 5.0
=> 5.0
irb(main):004:0> vec << 2.3
=> 2.3
irb(main):005:0> vec
=> std::vector<double,std::allocator< double > > [5.0,2.3]
irb(main):006:0> Stuff::test = vec
=> std::vector<double,std::allocator< double > > [5.0,2.3]
irb(main):007:0> vec2 = Stuff::Vectord.new(Stuff::test)
=> std::vector<double,std::allocator< double > > [5.0,2.3]
irb(main):008:0> Stuff::test.class
=> Array
irb(main):009:0> vec2.class
=> Stuff::Vectord
irb(main):010:0> Stuff::test
=> [5.0, 2.3]
Важно отметить, что статически типизированные цели SWIG в C # и Java дают ожидаемые результаты. Если у вас когда-нибудь возникает вопрос о том, как обрабатываются ваши типы в выводе SWIG, почти всегда неплохо сравнить вывод C # или Java с тем, что вы ожидаете.
Хотя Stuff::test
и Vectord
являются двумя разными типами, они оба являются массивами, которые могут хранить только двойные числа.
Они почти неразличимы внутри кода Ruby. Созданный код делает именно то, что вы хотите.