Я не уверен, как передать Buf
в качестве пользовательских данных, поскольку Buf
не является нативным типом. Но вместо этого вы можете использовать, например, CStruct
:
class UserData is repr('CStruct') {
has int32 $.dummy;
}
Тогда объявление будет:
sub exif_content_foreach_entry(
ExifContent $exifcontent,
&func (ExifEntry $entry, UserData $data),
UserData $user_data) is native(LIB) is export { * }
И обратный вызов может быть объявлен и определен, например:
sub my-callback (ExifEntry $entry, UserData $data) {
say "In callback";
say "Value of data: ", $data.dummy;
}
Редактировать :
Вот обходной путь для передачи типа Perl 6, такого как Buf
(т.е. не нативный тип), в обратный вызов с использованием замыкания. Например:
my $buf = Buf.new( 1, 2, 3);
my $callback = my sub (ExifEntry $entry, UserData $data) {
my-callback( $entry, $buf);
}
Затем объявите реальный обратный вызов my-callback
следующим образом:
sub my-callback (ExifEntry $entry, Buf $data) {
say "In callback";
say "Value of data: ", $data;
}
И вызвать библиотечную функцию следующим образом:
exif_content_foreach_entry( $content, &$callback, $data );