【发布时间】:2013-12-20 01:52:46
【问题描述】:
我已使用 SWIG 为我将在 ruby 中使用的 C++ 库生成包装器。
因为它是一个 C++ 库,所以方法名称不是“类似 ruby 的”,例如,它们是 camelCase。我还需要添加一些我自己的方法,例如运算符。
所以我正在考虑创建 ruby 类来包装 SWIG 类,但希望保持简单。这就是我想做的事情,除非有人能指出更好的方向。
我创建了这个“方法包装器”方法,我将使用它从新的 ruby 类中对应的 ruby meth 调用相应的 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
【问题讨论】: