简而言之:我使用 Cro 和 websocket 在互联网服务器上创建了一项服务。使用 Cro 示例非常简单。当页面作为本地主机时,从 HTML 页面发送和接收数据时没有问题。当使用 https 提供页面时,无法建立 websocket。wss协议如何与Cro一起使用?
更新:安装cro
并运行后cro stub :secure
,service.p6 还有一些文档中未明确的代码。
更多详细信息:我有一个在互联网服务器上运行的 docker 文件,Cro 设置为侦听 35145,因此 docker 命令是docker --rm -t myApp -p 35145:35145
服务文件包含
use Cro::HTTP::Log::File;
use Cro::HTTP::Server;
use Cro::HTTP::Router;
use Cro::HTTP::Router::WebSocket;
my $host = %*ENV<RAKU_WEB_REPL_HOST> // '0.0.0.0';
my $port = %*ENV<RAKU_WEB_REPL_PORT> // 35145;
my Cro::Service $http = Cro::HTTP::Server.new(
http => <1.1>,
:$host,
:$port,
application => routes(),
after => [
Cro::HTTP::Log::File.new(logs => $*OUT, errors => $*ERR)
] …
Run Code Online (Sandbox Code Playgroud) 在 Raku 中:当我使用 CALL-ME 方法创建对象时,我想使用< ... >
签名语法而不是( '...' )
when ...
is a Str。在文档中,有一个创建运算符的示例,它是具有特殊语法的普通 Raku sub。这种 sub 自动转换< ... >
为 Str。例如,如果我有
use v6.d;
class A {
has %.x;
method CALL-ME( Str:D $key ) { say %!x{ $key } }
}
my A $q .= new( :x( <one two three> Z=> 1..* ) );
$q('two');
$q<two>;
Run Code Online (Sandbox Code Playgroud)
但这会产生
2
Type A does not support associative indexing.
in block <unit> at test.raku line 10
Run Code Online (Sandbox Code Playgroud) 我有一个散列%h
,我想for
按键的字母顺序处理语句中的数据。
但是如果我sort
在散列上使用 a ,我会得到一个Pair
s的列表,这是可以理解的。但是我如何解压这个for
声明。
目前我正在使用以下内容:
my %h = <xabsu ieunef runf awww bbv> Z=> 1..*; # create a hash with random key names
for %h.sort {
my ($name, $num) = (.key, .value);
say "name: $name, num: $num"
}
# Output
# name: awww, num: 4
# name: bbv, num: 5
# name: ieunef, num: 2
# name: runf, num: 3
# name: xabsu, num: 1
Run Code Online (Sandbox Code Playgroud)
但我更喜欢更惯用的形式:
my %h = <xabsu …
Run Code Online (Sandbox Code Playgroud) 我开发了一个用于处理文档集合的模块。
该软件的一次运行会收集有关它们的信息。数据存储在称为%processed
和 的两个结构中%symbols
。需要缓存数据以供后续在同一组文档上运行软件,其中一些文档可能会发生变化。(文档本身是使用CompUnit 模块缓存的)。
目前数据结构的存储/恢复如下:
# storing
'processed.raku`.IO.spurt: %processed.raku;
'symbols.raku`.IO.spurt: %symbol.raku;
# restoring
my %processed = EVALFILE 'processed.raku';
my %symbols = EVALFILE 'symbols.raku';
Run Code Online (Sandbox Code Playgroud)
将这些结构输出到可能非常大的文件中可能会很慢,因为散列被解析以创建字符串化形式,并且因为它们正在重新编译而在输入时很慢。
它不用于检查缓存文件,仅用于保存软件运行之间的状态。
此外,虽然这对我的用例来说不是问题,但这种技术不能在一般情况下使用,因为字符串化(序列化)不适用于 Raku 闭包 - 据我所知。
我想知道是否可以使用 CompUnit 模块,因为它们用于存储模块的编译版本。那么也许,它们可以用来存储数据结构的“编译”或“内部”版本?
有没有办法做到这一点?
如果没有,是否有任何技术原因可能无法实现?
我在类中有一个方法来返回哈希值,目的是让子类覆盖该方法。但出于测试目的,我想要一个不同的哈希值。当类被实例化时,我希望测试选项被假定为 False,因此:test
在不需要时可以省略。
目前我这样做:
class A {
has %.tmps;
submethod BUILD( :$test = False ) {
%!tmps = $test ?? self.test-tmps !! self.default-tmps
}
method test-tmps { ... }
method default-tmps { ... }
}
Run Code Online (Sandbox Code Playgroud)
这就是我想要的,调用my A $x .= new
default-tmps,并my A $y .=new(:test)
调用test-tmps。
但我想知道如何通过多重调度删除 $test 的显式检查。但我无法找出适当的语法。我试过
class A {
has %.tmps;
submethod BUILD( :$test = False ) {
%!tmps = self.get-tmps( :$test )
}
multi method get-tmps( :test($)! where * ) {
# return the …
Run Code Online (Sandbox Code Playgroud) 我试图通过使用CompUnit类集预编译来创建POD6的缓存.
我可以创建,存储和检索pod,如下所示:
use v6.c;
use nqp;
my $precomp-store = CompUnit::PrecompilationStore::File.new(prefix=>'cache'.IO);
my $precomp = CompUnit::PrecompilationRepository::Default.new(store=> $precomp-store );
my $key = nqp::sha1('test.pod6');
'test.pod6'.IO.spurt(q:to/CONTENT/);
=begin pod
=TITLE More and more
Some more text
=end pod
CONTENT
$precomp.precompile('test.pod6'.IO, $key, :force);
my $handle = $precomp.load($key, )[0];
my $resurrected = nqp::atkey($handle.unit,'$=pod')[0];
say $resurrected ~~ Pod::Block::Named;
Run Code Online (Sandbox Code Playgroud)
所以现在我改变POD,我该如何使用:since
旗帜?我认为如果:since
在编译后包含一段时间,那么句柄的值将为Nil.情况似乎并非如此.
my $new-handle = $precomp.load($key, :since('test.pod6'.IO.modified));
say 'I got a new handle' with $new-handle;
Run Code Online (Sandbox Code Playgroud)
输出是'我有一个新手柄'.
我做错了什么?这是一个包含代码和输出的pastebin链接:https://pastebin.com/wtA9a0nP
我想把一个正则表达式放在一个YAML配置文件中(例如:config/filename.yaml),例如.
-
section: Begining
regex: '/ ^ <[ a..b, A..B ]> /'
-
section: Next
regex: '/ ^ <[ c..z, C..Z ]> /'
Run Code Online (Sandbox Code Playgroud)
当我把它读成哈希(例如,使用YAMLish)时,例如,
use YAMLish;
my @h = load-yaml('config/filename.yaml'.IO.slurp);
Run Code Online (Sandbox Code Playgroud)
我自然有一根绳子 @h[0]<regex>
那么如何从字符串中恢复正则表达式以便在匹配中使用?
我想要类似下面的东西,但以下不起作用:
say 'Its a beginning' if 'A beginning' ~~ @h[0]<regex>
Run Code Online (Sandbox Code Playgroud)
它不能按预期工作,因为它@h[0]<regex>
是一个Str,因此智能匹配是@h[0]<regex>
针对Str文字测试Str.那么如何让正则表达式脱离Str?
我有一个带有属性的类。我想检查是否定义了一些但不是全部。所以:
class A {
has $.a is rw;
has $.b is rw;
has $.c is rw;
has $.d is rw;
method delete { ... }
}
my A $x .= new(:a<hi>, :d<good>);
## later
$x.b = 'there';
## code in which $x.c may or may not be defined.
## now I want to check if the attributes a, b, and c are defined, without
## needing to know about d
my Bool $taint = False;
for <a b c> { …
Run Code Online (Sandbox Code Playgroud) 如何找到已在本地安装的模块,以及我可以use
在 Raku 程序中找到的模块?
假设我们有三个分布:Parent、Brother、Sister。父母'提供'Top.rakumod
,而 Brother 和 Sister 分别提供 'Top::Son.rakumod' 和 'Top::Daughter.rakumod'。兄弟姐妹在他们的 META6.json 中有一个 'depends': 'Top'。
每个发行版都在它自己的 git 存储库中。每个都是由zef安装的。
假设 Top 被设置为一个带有接口方法的类,可能类似于: multi method on-starting { ... }
,每个子类都必须实现它,并且在运行时为调用者提供有关子类的信息。这样既Top::Brother
和Top::Daughter
实施on-starting
。也可能Top::Aunt
存在未在本地安装的发行版等。我们需要找到安装了哪些。
所以,现在我们运行一个 Top 实例(在 Parent 中定义)。它需要寻找匹配的已安装模块Top::*
。开始的地方(我认为)是$*REPO
,它是包含已安装模块的存储库的链接列表。$*REPO 还承担 CompUnit::Repository 角色,后者又具有“need”方法。
我不明白的是如何操作 $*REPO 来获取所有匹配的候选模块的列表Top::*
,以及整个链表。
一旦我有了候选列表,我就可以使用^can
它来检查它是否有一个on-starting
方法,然后调用该方法。
如果这不是得到 Top 发现本地安装模块的结果的方法,我会很感激我刚刚提出的方案的一些替代方案。
cro run
当目录树中的任何内容发生更改时,停止服务器,重新编译,重新启动服务器。那太棒了。
但是在开发客户端 UI 并使用 NPX/yarn/webpack 时,需要一个额外的步骤来生成main.js
文件。
在 Cro 教程中,这一步似乎是手动完成的,即,我们有一行“我们有了它。npm run build
刷新,然后试一试”。这npm run build
是一个必须“手动”运行的命令。
有没有一种简单的方法,例如,.cro.yml
在检测到子目录树中的更改时使用强制另一个命令?例如,如果客户端 UI 文件在下面,path/to/cro-app/client-ui-directory
并且在任何文件更改时要运行的命令是path/to/cro-app/client-ui/directory/yarn build