我是Perl 6的新手.我的Atom编辑器中有以下代码,但我仍然不明白它是如何工作的.我复制了以下代码,正如doc.perl6.org所说,但它似乎无法正常工作.所以我把代码更改为:
use v6;
class HTTPHeader { ... }
class HTTPHeader does Associative {
has %!fields handles <self.AT-KEY self.EXISTS-KEY self.DELETE-KEY self.push
list kv keys values>;
method Str { say self.hash.fmt; }
multi method EXISTS-KEY ($key) { %!fields{normalize-key $key}:exists }
multi method DELETE-KEY ($key) { %!fields{normalize-key $key}:delete }
multi method push (*@_) { %!fields.push: @_ }
sub normalize-key ($key) { $key.subst(/\w+/, *.tc, :g) }
method AT-KEY (::?CLASS:D: $key) is rw {
my $element := %!fields{normalize-key $key};
Proxy.new(
FETCH => method () { $element },
STORE => method ($value) {
$element = do given $value».split(/',' \s+/).flat {
when 1 { .[0] } # a single value is stored as a string
default { .Array } # multiple values are stored as an array
}
}
);
}
}
my $header = HTTPHeader.new;
say $header.WHAT; #-> (HTTPHeader)
"".say;
$header<Accept> = "text/plain";
$header{'Accept-' X~ <Charset Encoding Language>} = <utf-8 gzip en>;
$header.push('Accept-Language' => "fr"); # like .push on a Hash
say $header.hash.fmt;
"".say;
say $header<Accept-Language>.values;
say $header<Accept-Charset>;
Run Code Online (Sandbox Code Playgroud)
输出是:
(HTTPHeader)
Accept text/plain
Accept-Charset utf-8
Accept-Encoding gzip
Accept-Language en fr
(en fr)
utf-8
Run Code Online (Sandbox Code Playgroud)
我知道它有效,但doc.perl6.org中的文档与此有点不同,它在第7行的AT-KEY方法之前没有"self".有没有更详细的例子呢?
有没有更详细的例子呢?
堆栈溢出实际上不是要求发布示例的更多细节的地方. 这是社区本身的perl6 doco - 我建议如果你有进一步的查询,最合适的地方是Perl6用户邮件列表,或者,如果没有,那么也许是IRC频道.
既然你已经发布了它,我很犹豫让问题得不到解决,所以这里有几件事需要考虑;
首先 - 您提出的示例是关于在自定义(即用户定义)类上实现关联下标 - 它不是自我描述的新手的典型区域.我想你会更好看,并执行在实例Perl6介绍由Naoum Hankache其网站已十分热烈.
其次,理解该示例显示了实现关联下标的三个选项至关重要; 第一个也是最简单的使用委托给私有哈希属性.Perl6通过在实现集合类型的对象上调用定义良好的方法来实现关联和位置下标(对于内置类型).通过handles在%!fields属性定义的末尾添加特征,您只需传递这些方法调用%!fields- 作为哈希 - 将知道如何处理它们.
引用示例:
但是,HTTP头字段名称应该不区分大小写(在camel-case中是首选).我们可以通过从句柄列表中取出*-KEY和push方法来实现这一点,并单独实现它们......
将所有密钥处理方法委托给内部哈希意味着您可以获得密钥的类似哈希的解释 - 这意味着它们将区分大小写,因为哈希密钥区分大小写.为避免这种情况,您可以从handle子句中获取所有与键相关的方法,并自行实现它们.在该示例中,密钥在用作索引之前通过"规范化器"运行,以%!fields使它们不区分大小写.
该示例的最后一部分显示了在进入类似哈希的容器时如何控制值的解释.到目前为止,通过分配给此自定义容器的实例提供的值必须是字符串或字符串数组.通过删除选项2中定义的AT_KEY方法并将其替换为提供代理对象的方法来实现额外控制.如果你要分配给容器,那么将调用代理对象的STORE方法,并且该方法扫描提供的字符串值为","(注意:空格是compolsory),如果找到,将接受字符串值作为几个字符串值的规范.至少,这就是我认为它的作用.
因此,该示例包含的内容比它看起来要多得多.你遇到了麻烦 - 正如布拉德在评论中所指出的那样 - 因为当你修改这个例子时,你可以选择使用选项3来修改选项1 togeather.