0

我正在尝试为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?

4

1 回答 1

0

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 代码中的实例参数。您只需Client client要从 VAPI 中删除显式参数 , :

[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);
   }
}
于 2020-09-27T19:54:24.187 回答