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

2023-11-30

我是 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(使用前将#替换为@)

如何在 Perl 6 中向我的自定义类添加下标? 的相关文章

  • 有什么方法可以轻松确保 zef 拉取最新版本的 raku 模块?

    我最近在这里提出问题关于 zef 下载模块的过时版本 NativeHelpers 回调当我尝试安装它时失败了zef install NativeHelpers Callback 我必须从 github 将模块克隆到本地计算机 然后从那里安装
  • Perl 6 如何评估真实性?

    在阅读有关 Perl 6 的内容时 我看到一个被大肆宣传的功能 您不再需要这样做 return 0 but true 但可以这样做 return 0 but True 如果是这样的话 Perl 6 中的 Truth 是如何工作的呢 在 Pe
  • 如何定义“AT-POS”方法?

    我定义了AT POS类的方法并导出 操作员 当我使用 然而 在该类的实例上 编译器忽略了我定义的运算符 这是代码 unit module somelib class SomeClass is export method AT POS ind
  • Perl 6 的 shell() 使用哪个 shell?

    Perl 6 的shell https docs perl6 org routine shell向 shell 发送命令 但没有说明那是什么 我一直得到bash在我的机器上 但我不知道我是否可以信赖它 perl6 e shell Q ech
  • Perl 6 的多重调度如何决定使用哪个例程?

    考虑这个程序 我在参数列表中构造了一个数组 尽管有一个接受数组的签名 但这调用了接受列表的签名 foo 1 2 3 multi foo Array array put Called Array version multi foo Array
  • Perl 6 分别捕获重复匹配组?

    我相信 Perl 6 提供了单独捕获重复组的能力 而不是早期的风格 您只能捕获最后一个组或整个匹配的组字符串 有人可以举一个很好的例子来说明如何使用 Perl 6 的这个很棒的功能吗 例如 我需要捕获此正则表达式的所有匹配组 and say
  • 分配给列表容器的混乱

    我可能患有大脑衰退 但根据有关项目和列表分配的文档 https docs raku org language variables Item and list assignment https docs raku org language v
  • Raku 正则表达式:最长标记匹配不一致

    Raku 的正则表达式预计会匹配最长的标记 事实上 这种行为可以在这段代码中看到 raku e AA m A say 1 AA say 2 2 但是 当文本位于变量中时 它似乎不会以相同的方式工作 raku e my a A my b AA
  • 只有“perl6”才能解析 Perl 6 吗?

    有一条 相对 众所周知的 Perl 公理 只有 Perl 可以解析 Perl 我想知道 Perl 6 是否仍然如此 扩大讨论 考虑到 PyPy 最近的更新 我想到了这个问题 Perl 独特的可解析性是否使其无法进行类似的努力 Perl 代码
  • 如何破解已安装的 perl6 模块源?

    我希望能够查看并更改已安装的源代码 通过zef perl6 模块 我怎样才能做到这一点 在我的系统上 模块源位于 perl6 sources 还有一些关于模块的元数据文件 perl6 dist 我也可以使用zef locate 显示模块的源
  • 在 Perl 6 中描述斐波那契数列有多少种方法?

    我一直在研究在 Perl 6 中构造惰性列表的各种方法 并且我想收集所有描述斐波那契数列的简洁方法 我将从以下三个开始masak http use perl org masak journal 的日记 my fibs 0 1 gt a b
  • 带替换的 Blob.decode 似乎不起作用

    这段代码 my or blob Blob new or ords or blob decode ascii replacement 0 strict False say 失败 Will not decode invalid ASCII co
  • 具有类型约束的无符号“变量”是否可以重新绑定? [复制]

    这个问题在这里已经有答案了 EDIT 关闭以支持https stackoverflow com questions 69231506 what are the rules for re binding 这是我在更清楚地理解我在这个问题中想问
  • 如何在action方法中获取匹配的token参数值?

    如果我的语法中有这样的内容 grammar G token tab indent Int level Using just level would require to have the same effect so use a code
  • 在perl6中,如何以段落模式读取文件?

    数据 txt hello world goodbye mars goodbye perl6 hello perl5 myprog py my fname data txt my infile open fname r nl gt n n f
  • 使用 Perl6 语法解析二进制结构

    使用 Perl6 解析二进制结构的最佳选择是什么 在 Perl5 中 我们在 Perl6 上有 pack unpack 方法 它们似乎是实验性的 是否可以使用 Perl6 语法来解析二进制数据假设我有一个文件 其中包含以下二进制格式的记录
  • 混淆 .fmt 行为与嵌套列表

    The docs https docs raku org routine fmt比如说fmt 返回一个字符串 其中列表中的每个元素都已根据以下格式进行格式化 format 第一个参数 并且每个元素由 separator 第二个论点 根据该描
  • Perl 6 可以根据排序规则进行排序或比较吗?

    The cmp操作员 https docs perl6 org language operators infix cmp适用于代码编号 或者至少我认为它是这样做的 因为文档对此没有明确说明 并且没有提及任何本地化内容 我可以按照其他排序规则
  • 哈希组合器无用,或者无法修改不可变哈希?

    这段代码 constant what doesn t gt change what will gt change 应该说一些类似于 无法修改不可变哈希 的内容 然而 它说 Potential difficulties Useless use
  • 每秒打印一些东西,并且在 Perl 6 中使用 React 每 5 秒睡眠 10 秒?

    我想每秒打印当前时间 并且还想每5秒睡眠10秒 react whenever Supply interval 1 say DateTime now posix whenever Supply interval 5 sleep 10 say

随机推荐