如何在Perl 6中为我的自定义类添加下标?

时间:2016-04-21 15:22:03

标签: perl6

我是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>;

输出是:

(HTTPHeader)

Accept  text/plain
Accept-Charset  utf-8
Accept-Encoding gzip
Accept-Language en fr

(en fr)
utf-8

我认为它有效,但是doc.perl6.org中的文档与此有点不同,它在第7行的AT-KEY方法之前没有“self”。有没有更详细的例子呢?

1 个答案:

答案 0 :(得分:5)

  

有没有更详细的例子?

堆栈溢出实际上不是要求发布示例的更多细节的地方。 This是社区本身的perl6 doco - 如果您有进一步的查询,我建议最合适的地方是Perl6用户邮件列表,或者,如果没有,那么也许是IRC频道。

既然你已经发布了它,我很犹豫让这个问题得不到解决,所以这里有几件事需要考虑;

首先 - 您提出的示例是关于在自定义(即用户定义)类上实现关联下标 - 它不是自我描述的新手的典型区域。我认为你最好通过 Naoum Hankache Perl6 intro处查看和实施示例,其网站得到了很好的接受。

选项1 - 通过委派轻松实施

其次,理解该示例显示用于实现关联下标的三个选项至关重要;第一个也是最简单的使用委托给私有哈希属性。 Perl6通过在实现集合类型的对象上调用定义良好的方法来实现关联和位置下标(对于内置类型)。通过在handles属性定义的末尾添加%!fields特征,您只需将这些方法调用传递给%!fields,这是一个散列 - 将知道如何处理它们。

选项2 - 灵活键

引用示例: 但是,HTTP头字段名称应该不区分大小写(在camel-case中是首选)。我们可以通过从句柄列表中取出*-KEYpush方法并单独实现它来实现此目的......

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

选项3 - 灵活值

示例的最后一部分显示了在进入类似哈希的容器时如何控制的解释。到目前为止,通过分配给此自定义容器的实例提供的值必须是字符串或字符串数​​组。通过删除选项2中定义的AT_KEY方法并将其替换为提供Proxy Object的方法来实现额外控制。如果您要分配容器并且 方法扫描提供的字符串值“,”,则会调用代理对象的STORE方法(注意:空格是compolsory),如果找到,将接受字符串值作为几个字符串值的规范。至少,这就是我的想法。

因此,该示例包含的内容比它看起来要多得多。你遇到了麻烦 - 正如布拉德在评论中所指出的那样 - 因为当你对这个例子进行修改时,你可以选择使用选项3对选项1进行捣碎。