我是 Perl 6 的新手。我的 Atom 编辑器中有以下代码,但我仍然不明白它是如何工作的。我复制了以下代码,作为docs.raku.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>;
输出是:
(HTTPHeader)
Accept text/plain
Accept-Charset utf-8
Accept-Encoding gzip
Accept-Language en fr
(en fr)
utf-8
我知道它有效,但是文档中docs.raku.org与此略有不同,第 7 行 AT-KEY 方法之前没有“self”。有没有更详细的例子?
有没有更详细的例子?
堆栈溢出实际上并不是请求有关已发布示例的更多详细信息的地方。This是社区本身的 perl6 doco - 如果您有进一步疑问,我建议最合适的地方是 Perl6 用户邮件列表,或者,如果做不到这一点,也许是 IRC 频道。
既然你已经发布了它,我很犹豫是否要不解决这个问题,所以,这里有一些需要考虑的事情;
首先 - 您提出的示例是关于在自定义(即用户定义的)类上实现关联下标 - 对于自我描述的新手来说,这不是典型的领域。我认为您最好查看并实施以下示例Perl6简介 by 纳乌姆·汉卡什其网站受到了广泛好评。
选项 1 - 通过委托轻松实施
其次,理解这个例子是很重要的three实现关联下标的选项;第一个也是最简单的使用私有哈希属性的委托。 Perl6 通过调用实现集合类型的对象上定义良好的方法来实现关联和位置下标(对于内置类型)。通过添加handles
定义末尾的特征%!fields
属性,您只需将这些方法调用传递给%!fields
作为一个哈希值,它会知道如何处理它们。
选项 2 - 灵活的按键
引用这个例子:但是,HTTP 标头字段名称应该不区分大小写(并且首选驼峰式大小写)。我们可以通过采取*-KEY
and push
处理列表之外的方法,并单独实现它们......
将所有密钥处理方法委托给内部哈希意味着您可以对密钥进行类似哈希的解释 - 这意味着它们将区分大小写,因为哈希密钥区分大小写。为了避免这种情况,您需要采取所有与键相关的方法在句柄子句之外并亲自实施它们。在示例中,键在用作索引之前先通过“规范化器”运行%!fields
使它们不区分大小写。
选项 3 - 灵活的值
该示例的最后部分展示了如何控制对values当它们进入类似散列的容器时。到目前为止,通过分配给此自定义容器的实例提供的值必须是字符串或字符串数组。额外的控制是通过以下方式实现的删除 AT_KEY 方法在选项 2 中定义,并将其替换为提供代理对象。如果您分配给容器并且代理对象的 STORE 方法将被调用that方法扫描提供的字符串值", "(注意:空格是必需的),如果找到,将接受字符串值作为多个字符串值的规范。至少,我认为是这样的。
因此,该示例包含的内容比看起来要多得多。正如 Brad 在评论中指出的那样,您遇到了麻烦,因为当您复制示例时,您将选项 1 与选项 3 混合在一起。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)