Delegates 代表的Vala语法?
首先是/usr/share/vala/vapi/libarchive.vapi中的一些定义Delegates 代表的Vala语法?,delegates,vala,Delegates,Vala,首先是/usr/share/vala/vapi/libarchive.vapi中的一些定义 [CCode (cprefix="ARCHIVE_", lower_case_cprefix="archive_", cheader_filename = "archive.h")] namespace Archive {... [CCode (instance_pos = 1.9, cname="archive_open_callback")] public delegate int OpenC
[CCode (cprefix="ARCHIVE_", lower_case_cprefix="archive_", cheader_filename = "archive.h")]
namespace Archive {...
[CCode (instance_pos = 1.9, cname="archive_open_callback")]
public delegate int OpenCallback (Archive archive);
...
[CCode (cname = "struct archive", free_function="archive_write_finish")]
public class Write : Archive {...
public Result open (
[CCode (delegate_target_pos = 0.9)] OpenCallback ocb,
[CCode (delegate_target_pos = 0.9)] WriteCallback rcb,
[CCode (delegate_target_pos = 0.9)] CloseCallback ccb
);
}
}
然后我的代码
int mOpenCallback (Write archive)
{
return Result.OK;
}
void foo(){...
Write archive = new Write();
archive.open(mOpenCallback,mWriteCallback,mCloseCallback);
...}
结果:错误:分配:无法从mOpenCallback'转换为Archive.OpenCallback'
void foo(){...
Write archive = new Write();
Archive.OpenCallback t = mOpenCallback;
archive.open(t,mWriteCallback,mCloseCallback);
...}
怎么了
然后我尝试了这个
namespace Archive {
int OpenCallback (Write archive)
{
return Result.OK;
}
}
void foo(){...
Write archive = new Write();
archive.open(OpenCallback,mWriteCallback,mCloseCallback);
...}
但它输出:Archive'已经包含了
OpenCallback'的定义
void foo(){...
Write archive = new Write();
Archive.OpenCallback t = mOpenCallback;
archive.open(t,mWriteCallback,mCloseCallback);
...}
输出错误:赋值:无法从foo.mOpenCallback'转换为Archive.OpenCallback'mOpenCallback
具有类型为Write
的参数,而不是Archive
,因此它的类型与委托的OpenCallback
不同。如果您希望Write
,则应执行从Archive
的强制转换,以便在回拨中写入。我最初的回拨代码是“public int-mOpenCallback(Archive-Archive){…}”,但此操作失败,并出现错误:`Archive'不是一种类型。所以我认为归档是虚拟的(在.vapi中没有用于归档的ctor)或者类似的东西。事实上,看起来我必须在类名(Archive)前面加上名称空间(Archive)。使用mOpenCallback(Archive.Archive Archive){…}它运行良好。因此,问题在某种程度上与使用Write参数而不是归档参数有关。
void foo(){...
Write archive = new Write();
Archive.OpenCallback t = mOpenCallback;
archive.open(t,mWriteCallback,mCloseCallback);
...}