我正在使用HTTP路由非常成功地使用Cro HTTP身份验证/授权/会话.
然后我添加了一个创建web-socket使用的路由,Cro::HTTP::Router::WebSocket我可以连接到它,Cro::WebSocket::Client一切正常.
现在我想控制对websocket的访问,所以我添加了一个Cro::HTTP::Auth参数.效果很好.现在客户端获得了401 Unauthorized预期的结果.
下一步,我该如何开门?
有了Cro::HTTP::Client,我可以传入Authorization标题,甚至传递auth选项.我该怎么做Cro::WebSocket::Client?
我对WebSocket很新,所以我甚至不知道这是否是这样做的正确方法,但似乎该Cro::WebSocket::Client connect方法应该采用一个headers命名选项来获取传递的额外标题.
我正在尝试创建一个迭代器,然后从中构建一个序列,但它不会按我认为应该的方式运行.这是怎么回事?
这是我的基础课:
class Foo {
has $.x = 0;
has $.max = 3;
method val() {
(++$!x > $!max) ?? () !! ($!x, "string $!x")
}
}
my $foo = Foo.new;
say $foo.val.perl for ^4;
# (1, "string 1")
# (2, "string 2")
# (3, "string 3")
# ()
Run Code Online (Sandbox Code Playgroud)
它只是迭代到max,然后return(),按照我认为的方式工作.
然后我从中构建一个迭代器,只需一个pull-one()方法.
class Foo-Iterator does Iterator {
has Foo $.foo;
method pull-one() {
$!foo.val || IterationEnd
}
}
my $iter = Foo-Iterator.new(foo => Foo.new);
$iter.pull-one.perl.say for ^4;
# (1, …Run Code Online (Sandbox Code Playgroud) 我理解这个问题涉及到特定于实现的域,但在这一点上,Rakudo/MoarVM的具体答案对我也有帮助.
我正在研究一些NativeCall模块,并想知道如何调试内存泄漏.一些内存在C库中处理,我在那里有一个很好的处理.我知道域名是我的责任,MoarVM在那里没有什么可以做的.我可以在MoarVM域中做什么?检查悬空物体,循环参考物等的最佳方法是什么?
在一系列操作结束时是否有一种方法,我认为我的所有Perl对象都超出范围说"运行垃圾收集并告诉我任何事情"?
我可以运行一些Rakudo/NQP/MoarVM特定代码来帮助我吗?这不是为了在生产中发布,只是为了在我开发时进行测试/诊断.
MoarVM中的垃圾收集提供了一个诱人的概述,但没有足够的信息让我对它做任何事情.
有没有办法在CStruct中声明一个对象数组?
struct my_struct {
int foo;
int bar;
char somestring[80];
};
class My::Struct is repr('CStruct') {
has int32 $.foo;
has int32 $.bar;
???
}
Run Code Online (Sandbox Code Playgroud)
A CArray[uint8]将是一个char *指针,实际上并不在结构中保留空间.
而不是My::Struct.new,我可能自己做内存(而不是My::Struct.new(),我使用一个buf8.allocate(xxx)并保持句柄,所以GC不收割它,nativecast它到My :: Struct),然后我必须使用指针数学来找到里面的字符串结构等,但似乎应该有一个更简单的方法.
即使它没有完全实现,一个简单的方法说"在这里放80个字节,这里是指针",这将是非常好的.
我有一个类可以扮演另一个角色.该类中的方法可以访问顶级角色中的属性:
role A {
has $.x
}
role B does A {
}
class C does B {
method this() { say $!x }
}
C.new(:x(1)).this;
Run Code Online (Sandbox Code Playgroud)
这工作正常,并说我认为应该如此.
但我有很多类都做角色B,我想分享方法this(),所以我把它移到角色B:
role A {
has $.x
}
role B does A {
method this() { $!x }
}
class C does B {}
C.new(:x(1)).this;
Run Code Online (Sandbox Code Playgroud)
那甚至都不会编译:SORRY Attribute $!x not declared in role B.
角色是否可以在其包含的角色中看不到属性?
我正在使用NativeCall接口.
该库将多次调用我的回调函数.
这很好.我可以使用正确的签名声明我的回调,将其作为&callback传入,并且库调用sub就好了.
它还能够将有效负载void*指针设置为我想要的任何东西,并且它将包含在我的回调函数调用中.
我可以隐藏一个Perl Str,例如,在有效载荷中成功往返吗?
sub set_userdata(Pointer) returns int32 is native { ... }
sub set_callback(&callback(Pointer $userdata --> int32)) returns int32 is native { ... }
sub callback(Pointer $userdata) returns int32 {
my Str $mystring = ???
...
}
my Str $my-userdata-string;
set_userdata(???);
set_callback(&callback);
Run Code Online (Sandbox Code Playgroud)
看起来它可能适用于一些绑定,"是rw",nativecast()和/或.deref.
我正在尝试使用 NativeCall 与一些 C 函数进行交互。
我有一个简单的 C 结构体和一个需要它们的数组的函数。
struct foo {
int x;
char *s;
};
struct foo foo_array[3];
foo_array[0].x = 12;
foo_array[0].s = "foo";
foo_array[1].x = 27;
foo_array[1].s = "bar";
foo_array[2].x = -1;
void somefunc(foo_array);
Run Code Online (Sandbox Code Playgroud)
我尝试了很多方法,但似乎无法完全正确。
class foo is repr('CStruct') {
has int32 $.x;
has Str $.s
};
sub somefunc(CArray[foo]) is native { * }
my @foo-array := CArray[foo].new;
@foo-array[0] = ???
@foo-array[1] = ???
@foo-array[2] = ???
somefunc(@foo-array);
Run Code Online (Sandbox Code Playgroud)
如何正确创建 foo 类的对象并设置它们的值,以及如何制作适合传递的数组?
使用Perl6 Test模块通过以下命令测试对象的类型Buf:
use Test;
isa-ok Buf.new, Buf;
isa-ok Buf.new, Blob;
isa-ok Buf.new, 'Buf';
isa-ok Buf.new, 'Blob';
ok Buf.new ~~ Buf;
ok Buf.new ~~ Blob;
does-ok Buf.new, Buf;
does-ok Buf.new, Blob;
Run Code Online (Sandbox Code Playgroud)
这是输出:
not ok 1 - The object is-a 'Buf'
# Failed test 'The object is-a 'Buf''
# at buftest line 3
# Actual type: Buf
not ok 2 - The object is-a 'Blob'
# Failed test 'The object is-a 'Blob''
# at buftest line 5
# Actual …Run Code Online (Sandbox Code Playgroud) 我Buf想传递给C库中有一个内存块,但是该库将在单个调用的生命周期之外使用内存。
我知道这是有问题的,因为垃圾收集器可以移动内存。
为了传递a Str,Nativecall文档
说:“如果C函数要求字符串的生存期超过函数调用的长度,则必须对参数进行手动编码并以CArray [uint8]的形式传递”,并举例说明:
my $array = CArray[uint8].new($string.encode.list);
Run Code Online (Sandbox Code Playgroud)
我的问题是:我是否必须为同一件事做同样的事情Buf?万一它被GC移动了?还是GC会离开我的Buf位置?对于短字符串,这没什么大不了的,但是对于大内存缓冲区,这可能是昂贵的操作。(例如,请参见Archive :: Libarchive,可以将其Buf与tar文件一起传递。该代码有问题吗?
multi method open(Buf $data!) {
my $res = archive_read_open_memory $!archive, $data, $data.bytes;
...
Run Code Online (Sandbox Code Playgroud)
是否有(可能有呢?应该有?)某种trait上Buf,它告诉GC不能移动它?我知道如果我向中添加更多数据可能会很麻烦Buf,但我保证不会这样做。对于一个Blob不变的东西呢?
我正在尝试使用NativeCall与某些C函数进行交互.
对于一种情况,我需要传入由函数更新的指针,因此它需要指向指针的指针'void**'.
我试过这样的:
class Foo
{
has Pointer $.first;
has Pointer $.last;
sub somefunc(Pointer is rw, Pointer is rw, Str) is native { * }
method myfunc(Str $arg) {
somefunc($!first, $!last, $arg);
}
}
Run Code Online (Sandbox Code Playgroud)
它不起作用.指针不会被函数更新.
由于C数组基本上是指向指针的指针,我可以这样伪造它:
class Foo
{
has Pointer $.first;
has Pointer $.last;
sub somefunc(CArray[Pointer], CArray[Pointer], Str) is native { * }
method myfunc(Str $arg) {
my $first = CArray[Pointer].new($!first);
my $last = CArray[Pointer].new($!last);
somefunc($first, $last, $arg);
$!first = $first[0];
$!last = $last[0];
}
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好.看起来像"是rw"应该强制指针指针,它应该以第一种方式工作.
我究竟做错了什么?
Perl 6 文档列出了一堆类型.其中一些(例如Str)具有更复杂的盒子/拆箱行为.
是否可以定义我自己的类型,为box/unboxing指定我自己的例程?对于一个特定的项目,我有一堆我正在重用的类型,并且基本上一遍又一遍地剪切/粘贴我的访问器功能.
例如,C Struct使用a time_t,我插入访问器方法来往/来自a DateTime.另一个例子是以逗号分隔的列表,我想进入/离开Array并自动处理split/ join.
有一个更好的方法吗?
编辑:添加示例:
constant time_t = uint64;
constant FooType_t = uint16;
enum FooType <A B C>;
class Foo is repr('CStruct') is rw
{
has uint32 $.id;
has Str $.name;
has FooType_t $.type;
has time_t $.time;
method name(Str $n?) {
$!name := $n with $n;
$!name;
}
method type(FooType $t?) {
$!type = $t with $t;
FooType($!type);
}
method time(DateTime $d?) { …Run Code Online (Sandbox Code Playgroud) 试图与一个 C 库接口,该库采用一个带有一堆指向它在不同点调用的函数的指针的结构。
像这样:
struct callbacks {
int (*foo)(int);
int (*bar)(int);
}
int set_callbacks(callbacks *cbs);
Run Code Online (Sandbox Code Playgroud)
我可以进行回调:
sub foo-callback(int32 --> int32) {...}
sub bar-callback(int32 --> int32) {...}
Run Code Online (Sandbox Code Playgroud)
如果这样做会很酷:
class Callbacks is repr<CStruct>
{
has &.foo (int32 --> int32);
has &.bar (int32 --> int32);
}
Run Code Online (Sandbox Code Playgroud)
但事实并非如此。我正在尝试做一些事情:
class Callbacks is repr<CStruct>
{
has Pointer $.foo;
has Pointer $.bar;
}
Run Code Online (Sandbox Code Playgroud)
并将它们设置为nativecast(Pointer, &foo-callback)或一些,但我似乎无法强迫它们在那里。
除了编写一个小 C 函数来获取所有 Perl 6 函数指针并将它们插入 C 中的结构之外,还有什么方法可以做到这一点?