我已经使用SWIG为我将在ruby中使用的C ++库生成包装器。
由于它是一个C ++库,因此方法名称不是“ruby like”,例如它们是camelCase。我还需要添加一些自己的方法,例如运算符。
所以我在考虑创建ruby类来包装SWIG类,但希望保持简单。这是我在想的事情,除非有人能指出我更好的方向。
我创建了这个“方法包装器”方法,我将用它从新的ruby类中相应的ruby方法调用相应的swig生成方法。
我正在使用ruby通过
获取方法的方案some_method = SomeClass.method(:some_method_name)
然后通过
调用它some_method.call
该计划有任何问题吗?
这是我的方法包装器方法:
def method_wrapper(target_method, hash_keys, args=[])
if args.length == 0
#puts "calling without args"
return_value = target_method.call
else
if args[0].class == Hash
method_args = Array.new
hash_args = args[0]
hash_keys.each do |key|
arg_value = hash_args[key]
method_args << arg_value if arg_value
end
#puts "calling with hash args #{method_args}"
return_value = target_method.call(*method_args)
else
#puts "calling with args"
retrun_value = target_method.call(*args)
end
end
return return_value
end
以下是我将如何使用它来包装SWIG生成的类
中的每个方法class RubyClassName
def ruby_method_name(*args)
return method_wrapper(Swig_module_name::SwigClassName.method(:swigMethodName), [:ruby_hash_key_arg1, :ruby_hash_key_arg2], args)
end
end
然后我可以调用像这样的方法
RubyClassName.ruby_method_name
RubyClassName.ruby_method_name some_value
RubyClassName.ruby_method_name(some_value1, some_value2)
RubyClassName.ruby_method_name :ruby_hash_key_arg1 => some_value
RubyClassName.ruby_method_name :ruby_hash_key_arg2 => some_value2, :ruby_hash_key_arg1 => some_value1
答案 0 :(得分:1)
您可以使用%rename指令将C ++类和函数重命名为其他内容(例如,将FooBar重命名为fooBar或foo_bar)。
您可以使用%extend添加自己的运算符等。
我相信以上内容将支持您拥有的所有调用示例,而无需第二层包装。