在vapi中隐式传递实例

  • 本文关键字:实例 vapi vala vapi
  • 更新时间 :
  • 英文 :


我正在尝试为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,使实例在没有冗余的情况下隐式传递?

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);
}
}

最新更新