在vapi中隐式传递实例
Implicitly pass instance in vapi
我正在尝试为 mongoc
库编写一个 VAPI。
我从结构中创建了一些紧凑的 类,并带有一些与之关联的函数。
例如 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);
}
}
我正在尝试为 mongoc
库编写一个 VAPI。
我从结构中创建了一些紧凑的 类,并带有一些与之关联的函数。
例如 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);
}
}