在ruby中包含swig生成的类是否有一个很好的通用方法?

时间:2013-12-19 17:09:42

标签: c++ ruby swig

我已经使用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

1 个答案:

答案 0 :(得分:1)

您可以使用%rename指令将C ++类和函数重命名为其他内容(例如,将FooBar重命名为fooBar或foo_bar)。

您可以使用%extend添加自己的运算符等。

我相信以上内容将支持您拥有的所有调用示例,而无需第二层包装。