【问题标题】:Implicitly pass instance in vapi在 vapi 中隐式传递实例
【发布时间】:2020-09-27 18:23:34
【问题描述】:

我正在尝试为 mongoc 库编写 VAPI。

我已经从 struct 创建了一些紧凑的类,并带有一些与之关联的函数。 例如Client 看起来像这样:

[Compact]
[CCode (cname = "mongoc_client_t", free_function = "mongoc_client_destroy", has_type_id = false)]
public class Client {

   [CCode (cname = "mongoc_client_new")]
   public Client (string uri);
}

我还需要绑定一堆相关的函数。 我尝试将它们绑定为实例方法,如下所示:

[CCode (cname = "mongoc_client_get_database")]
public Database get_database (Client client, string dbname);
//Database is another compact class

所以结果是这样的:

[CCode (cheader_filename = "mongoc.h")]
namespace Mongo {
   [Compact]
   [CCode (cname = "mongoc_client_t", free_function = "mongoc_client_destroy", has_type_id = false)]
   public class Client {

      [CCode (cname = "mongoc_client_new")]
      public Client (string uri);

      [CCode (cname = "mongoc_client_get_database")]
      public Database get_database (Client client, string dbname);
   }
}

我希望它将第一个 client 参数作为调用实例。 而不是这个:

var client = new Client ("uri");
var db = client.get_database (client, "test");
//client is redundant

我想得到这个:

var client = new Client ("uri");
var db = client.get_database ("test");
//The Client instance is passed implicitly

我尝试使用this、静态方法、instance_pos 和其他调整,但我没有找到让它以这种方式工作的方法。

是否可以在 Vala 中将实例作为参数隐式传递? 如果是这样,我如何才能以隐式传递实例而没有冗余的方式绑定 VAPI?

【问题讨论】:

标签: vala vapi


【解决方案1】:

mongoc_client_get_database() 的 C API 显示函数签名是:

mongoc_database_t * mongoc_client_get_database (mongoc_client_t *client, const char *name);

所以monogc_client_t 在 C API 中显式传递。在 Vala 中,这会自动生成为 C 代码中的实例参数。您只需从 VAPI 中删除显式参数 Client client

[CCode (cheader_filename = "mongoc.h")]
namespace Mongo {
   [Compact]
   [CCode (cname = "mongoc_client_t", free_function = "mongoc_client_destroy", has_type_id = false)]
   public class Client {

      [CCode (cname = "mongoc_client_new")]
      public Client (string uri);

      [CCode (cname = "mongoc_client_get_database")]
      public Database get_database (string dbname);
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多