【问题标题】:Is there a good general methodology for wrapping swig generated classes in ruby?是否有一种很好的通用方法可以在 ruby​​ 中包装 swig 生成的类?
【发布时间】: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

【问题讨论】:

    标签: c++ ruby swig


    【解决方案1】:

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

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

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

    【讨论】:

    • 我阅读了重命名指令,我将不得不阅读扩展。我在这里读到很多时候人们会创建这些包装器 ruby​​ 类,即使它只是为了记录 api。您认为最好避免添加额外的层?
    • 我喜欢更少的层;错误的机会更少。但是记录导出的 API 肯定是有价值的。 SWIG 不支持这一点,所以我一直看到 API 的导出器将用户推荐给 C++ 文档,他们通常可以弄清楚如何使用它。但是如果你添加很多自己的方法,C++ 文档就不够用了。您使用什么文档工具?在 Python 中,我们有 sphinx,它可以在不编辑代码的情况下轻松记录类。
    • 我使用了 rename 指令,它几乎完成了我想要的操作
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2014-01-03
    • 2013-07-09
    • 1970-01-01
    • 2010-12-17
    • 2010-11-10
    • 2022-12-04
    相关资源
    最近更新 更多