当前位置: 首页 > 知识库问答 >
问题:

如何在Perl 6中向自定义类添加下标?

贺君浩
2023-03-14

我是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方法之前没有“自”。有没有更详细的例子?

共有1个答案

隆钊
2023-03-14

有没有更详细的例子?

堆栈溢出实际上并不是请求发布示例的更多细节的地方。这是关于社区本身的perl6文档-如果您有进一步的疑问,我建议您最合适的地方是perl6用户邮件列表,如果没有,也许是IRC频道。

现在你已经发布了它,我很犹豫让这个问题不被解决,所以,这里有一些事情要考虑;

首先,您提出的示例是关于在自定义(ie用户定义)类上实现关联订阅的,这不是自述新手的典型领域。我认为你最好看看NaoumHankache在Perl6简介中的例子,并加以实现,NaoumHankache的网站受到了很好的欢迎。

其次,必须理解,该示例显示了实现关联订阅的三个选项;第一种也是最简单的方法使用对私有哈希属性的委托。Perl6通过对实现集合类型的对象调用定义良好的方法来实现关联和位置下标(对于内置类型)。通过在<代码>%定义的末尾添加<代码>句柄<代码>特征!字段,您只需将这些方法调用传递给%!字段(作为哈希)将知道如何处理它们。

举个例子:然而,HTTP头字段名应该不区分大小写(最好是驼峰大小写)。我们可以通过从句柄列表中取出*-键和推送方法,并分别实现它们来适应这种情况。。。

将所有键处理方法委托给内部哈希意味着您可以对键进行类似哈希的解释——这意味着它们将区分大小写,因为哈希键区分大小写。为了避免这种情况,您从句柄子句中取出所有与键相关的方法并自己实现它们。在示例中,键在用作%!字段的索引之前通过“规范化器”运行,使它们不区分大小写。

示例的最后一部分显示了如何在值进入类似散列的容器时控制其解释。到目前为止,通过分配给此自定义容器的实例所提供的值必须是字符串或字符串数组。通过删除选项2中定义的AT\u KEY方法并将其替换为提供代理对象的方法,可以实现额外的控制。如果要为容器赋值,并且该方法扫描提供的字符串值中的“,”(注意:空格为compolsory),则将调用代理对象的STORE方法,如果找到,则将接受字符串值作为多个字符串值的规范。至少,我认为它是这样做的。

因此,这个例子比它看起来要复杂得多。正如Brad在评论中指出的那样,您遇到了麻烦,因为您在复制示例时将选项1与选项3混为一谈。

 类似资料:
  • 我有一些不应该实例化的带有自定义注释的类(抽象类,它只是实际bean的子组件)。但是在这些类之上,在运行时,在上下文初始化阶段,我想在应用程序上下文中添加额外的bean。 因此,基本上我需要扫描类路径,处理结果,并将新bean引入curent应用程序上下文。 似乎是spring-mvc、spring-tasks和spring-integration在做这件事(我试着从源代码中学习--没有运气) 我

  • 在RestTemplate中,我有一个自定义拦截器,它将记录一些请求-响应详细信息并保存到数据库。 我的自定义拦截器: springboot中的RestTemboard bean配置: 将拦截器添加到restTemboard bean: 如何将此拦截器添加到佯装客户端? 正在应用中。yml: InterceptorOne为假装客户端中的每个请求添加标头: 但是我不能添加日志服务拦截器,因为它由于错

  • 我想在向url发送请求时添加假用户代理。但它并没有添加假useragent,而是使用默认的useragent。

  • 是否有一个时间格式来指定这样的日期序列到轴在D3和v4?

  • 好的,在laravel 4中,如果我想添加自己的自定义类,例如:库\myFunction.php然后我执行以下步骤: 添加myFunctions.php到app/库/myFunctiosn.php 在app/start/global.php,在ClassLoader::addDirectory(数组(,我添加app_path()。 为了在我的刀片视图中调用它,我添加了以下代码 它是有效的。 但是如

  • 我的工具基本上读取PDF并在JTextArea中打印PDF的内容。在我的PDF包含阿拉伯语的PH Mirjan字体之前,一切正常。我的文本区域显示一些垃圾字符,如下所示。 我该如何解决这个问题? 我的文本区域的默认字体是Arial Unicode MS。我可以配置文本区域的字体吗?假设我在本地下载了PH Mirjan,如何将文本区域字体更改为下载的字体。非常感谢任何建议或参考链接。 编辑 这给了我