如何在Perl6中编写自定义访问器方法?
如果我有这个课程:
class Wizard {
has Int $.mana is rw;
}
Run Code Online (Sandbox Code Playgroud)
我可以做这个:
my Wizard $gandalf .= new;
$gandalf.mana = 150;
Run Code Online (Sandbox Code Playgroud)
假设我想在我的Perl6类中为一个setter添加一点检查而不放弃$gandalf.mana = 150;表示法(换句话说,我不想写这个:) $gandalf.setMana(150);.如果它试图设定负面法术力,该程序应该死亡.我该怎么做呢?Perl6文档提到它可以编写自定义访问器,但没有说明如何.
我正试图在Perl 6中感到舒服.当我在REPL提示符下时,我在Python中发现的一件事就是我可以做一个dir(对象)并找出一个对象的属性,在Python中包含对象的方法.
这通常有助于提醒我想做什么; "哦,这是正确的,Python中的修剪被称为条带",就像那样.
在Perl 6中,我知道内省方法.WHO,.WHAT,.WHICH,.HOW和.WHY,但这些是在类或对象级别.我如何找出对象内部的内容,以及我可以对它做些什么?
我安装了Perl6 rakudobrew并且浏览已安装的文件以查看十六进制文件名列表~/.rakudobrew/moar-2018.08/install/share/perl6/site/sources以及~/.rakudobrew/moar-2018.08/install/share/perl6/sources/.
例如
> ls ~/.rakudobrew/moar-2018.08/install/share/perl6/sources/
09A0291155A88760B69483D7F27D1FBD8A131A35 AAC61C0EC6F88780427830443A057030CAA33846
24DD121B5B4774C04A7084827BFAD92199756E03 C57EBB9F7A3922A4DA48EE8FCF34A4DC55942942
2ACCA56EF5582D3ED623105F00BD76D7449263F7 C712FE6969F786C9380D643DF17E85D06868219E
51E302443A2C8FF185ABC10CA1E5520EFEE885A1 FBA542C3C62C08EB82C1F4D25BE7B4696F41B923
522BE83A1D821D8844E8579B32BA04966BAB7B87 FE7156F9200E802D3DB8FA628CF91AD6B020539B
5DD1D8B49C838828E13504545C427D3D157E56EC
Run Code Online (Sandbox Code Playgroud)
这些文件包含软件包的源代码,但这种方式并不容易访问.那是什么理由?
我知道在Perl 6使用该后端时可以调用Java:如何从perl6调用Java方法
有没有办法访问例如Perl 6中的JavaScript DOM接口,并在浏览器中运行新的Rakudo JavaScript VM?
也许是这样的:
use v6;
use javascript::dom:from<JavaScript>;
Run Code Online (Sandbox Code Playgroud) 我被 Raku 所吸引是因为它的内置语法,并认为我会玩弄它并编写一个简单的电子邮件地址解析器,唯一的问题是:我无法让它工作。
在找到真正有效的东西之前,我尝试了无数次迭代,但我很难理解为什么。
它归结为,正在更改token为rule。
这是我的示例代码:
grammar Email {
token TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }
token name { \w+ ['.' \w+]* }
token domain { \w+ }
token subdomain { \w+ }
token tld { \w+ }
}
say Email.parse('foo.bar@baz.example.com');
Run Code Online (Sandbox Code Playgroud)
不起作用,它只是打印Nil,但是
grammar Email {
rule TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }
token name { \w+ ['.' \w+]* }
token domain { \w+ }
token subdomain …Run Code Online (Sandbox Code Playgroud) 我正在尝试解析带引号的字符串。像这样的东西:
say '"in quotes"' ~~ / '"' <-[ " ]> * '"'/;
Run Code Online (Sandbox Code Playgroud)
(来自https://docs.raku.org/language/regexes “枚举字符类和范围”)但是......我想要更多一种类型的引用。这样的东西组成了不起作用的语法:
token attribute_value { <quote> ($<-quote>) $<quote> };
token quote { <["']> };
Run Code Online (Sandbox Code Playgroud)
我发现这个讨论是另一种方法,但它似乎没有去任何地方:https : //github.com/Raku/problem-solving/issues/97。有没有办法做这种事情?谢谢!
我无法让@user0721090601 的“多令牌”解决方案起作用。我的第一次尝试产生了:
say '"in quotes"' ~~ / '"' <-[ " ]> * '"'/;
Run Code Online (Sandbox Code Playgroud)
在做了一些研究之后,我补充说proto token quoted_string {*}:
#!/usr/bin/env raku
use Grammar::Tracer;
grammar QuotedString {
proto token quoted_string {*}
multi token quoted_string:sym<'> { <sym> ~ <sym> <-[']> }
multi token quoted_string:sym<"> { <sym> ~ <sym> …Run Code Online (Sandbox Code Playgroud) 常见问题解答:在 Raku 中,如何根据索引从字符串中删除一些字符?
假设我想删除索引 1 到 3 和 8
xxx("0123456789", (1..3, 8).flat); # 045679
Run Code Online (Sandbox Code Playgroud) 我正在尝试将单词wall转换为它的 ascii 代码列表,(119, 97, 108, 108)如下所示:
my @ascii="abcdefghijklmnopqrstuvwxyz";
my @tmp;
map { push @tmp, $_.ord if $_.ord == @ascii.comb.any.ord }, "wall".comb;
say @tmp;
Run Code Online (Sandbox Code Playgroud)
有没有办法使用@tmp而不在单独的行中声明它?
有没有办法在一行而不是 3 行中生成 ascii 代码列表?如果是这样,该怎么做?
请注意,我必须使用@ascii变量,即我不能使用连续递增的 ascii 序列,(97, 98, 99 ... 122)因为我也计划将此代码用于非 ascii 语言。
在 Raku 发行版中,我如何依赖Foo::Bar或Foo::Baz不依赖两者?
我有这个工作:
my %pnt = %( cardinal => <N E S W>,
ordinal => <N NE E SE S SW W NW>,
half-winds => <N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW>,
);
Run Code Online (Sandbox Code Playgroud)
我认为有可能以编程方式创建半风阵列。
然而,我可怜的尝试似乎更加冗长:
my @cards = <N E S W>;
my @odds = <NE SE SW NW>;
my @ords = ( @cards Z @odds ).flat;
my @mids = ( ( @cards Z~ @odds ) Z ( @cards.rotate(1) Z~ @odds ) ).flat; …Run Code Online (Sandbox Code Playgroud) raku ×10
perl6 ×4
rakudo ×2
dependencies ×1
grammar ×1
javascript ×1
list ×1
package ×1
regex ×1