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

我怎么打电话。为什么在Perl 6中的类中使用子例程?

郭元明
2023-03-14

调用。WHY对声明的东西返回围绕它构建的特殊注释。这很酷。我如何引用在类中定义的子例程?它总是隐藏的吗?我对提供子例程而不是类的模块很好奇(答案可能是“不要这样做”)。我主要是在玩的限制。为什么以及我能走多远。

#| This is the outside bit
sub outside { 137 }
put &outside.WHY; # This works

#| Class Foo is an example
class Foo {
    #| The bar method returns a number
    method bar { 137 }

    #| quux is a submethod
    submethod quux { 137 }

    #| qux is private
    submethod !qux { 137 }

    #| The baz method also returns a number
    sub baz { 37 }

    put &baz.WHY; # this works in this scope
    }

put "---- With an object";
quietly {
    my $object = Foo.new;
    put "As object: ", $object.WHY;

    # sub is not really a method?
    put "As object - bar: ", $object.^find_method( 'bar' ).WHY;

    # should this work? It *is* private after all
    put "As object - qux: ", $object.^find_method( 'qux' ).WHY;
    }

put "---- With class name";
quietly {
    put Foo.WHY;
    put "As class lookup: ", ::("Foo").WHY;
    put "As class lookup (quux): " ~  Foo.^lookup( 'quux' ).WHY;
    put "As class lookup (baz): " ~  Foo.^lookup( 'baz' ).WHY;  # nope!

    # this is the part where I need help
    put "As :: lookup: ", ::("Foo")::("&baz").WHY; #nope
    }

以下是输出:

This is the outside bit
The baz method also returns a number
---- With an object
As object: Class Foo is an example
As object - bar: The bar method returns a number
As object - qux:
---- With class name
Class Foo is an example
As class lookup: Class Foo is an example
As class lookup (quux): quux is a submethod
As class lookup (baz):
As :: lookup:

这是我要问的最后一行输出。如何访问类中定义的子例程?

共有2个答案

华阳秋
2023-03-14

这只是工作中的词汇范围:

SUB默认为“我的代码”,因此如果您想从外部获取它们,您必须添加我们的代码(或者以其他方式手动公开它们-据我所知,没有内置的方法来获取它们,无论是通过MOP还是其他元编程功能,如“我的:: 伪包”)。

我对提供子例程而不是类的模块很好奇

这就是is export的目的。

魏康安
2023-03-14
    # should this work? It *is* private after all
    put "As object - qux: ", $object.^find_method( 'qux' ).WHY;

以下两项工作:

put "As object - qux: ", $object.^find_private_method('qux').WHY;
put "As object - qux: ", $object.^private_method_table<qux>.WHY;

find\u private\u method似乎没有记录在p6doc中,所以我不确定它是否是官方API。private\u method\u table有记录,尽管没有真正解释。)

    # this is the part where I need help
    put "As :: lookup: ", ::("Foo")::("&baz").WHY; #nope

如果您将sub-baz{37}声明为我们的sub-baz{37},则此选项有效
您还可以更简单地将查找编写为:

put "As :: lookup: ", &Foo::baz.WHY;

我们的声明器(在大纲3“声明器”一节中解释)将一个符号与当前包(在本例中是一个类)相关联,以便可以使用语法从外部访问它。

默认情况下,子例程的作用域是词汇性的,即如果没有指定它们的默认声明符,则它们的默认声明符是my。(这句话基本上与我写的效果相同

我对提供子例程而不是类的模块很好奇

如上图所示,使用我们的声明它(在这种情况下,用户范围必须使用完全限定名称Foo::baz),或者将其导出到用户范围中(在这种情况下,他们可以将其称为baz)。

使符号可导出的最简单方法是使用is export特性:

module Foo {
    #| The baz method also returns a number
    sub baz is export(:ALL) { 37 }
}

import Foo :ALL;

say &baz.WHY;

use语句隐式调用有关模块的import。由于这里的模块定义在同一个文件中,我们可以直接调用import。

请注意,您还可以编写sub baz is export{37}(不带:ALL),在这种情况下,只要类是使用'd或导入'ed,默认情况下就会导入符号。但在Perl 5/CPAN社区中,这被认为是不好的做法,建议用户导入单个符号。在Perl 6中,导入单个符号还不起作用,因此我建议现在使用:ALL标记。

1)我知道的唯一区别是,在第一种情况下,例程知道自己的名称以进行内省。

 类似资料:
  • 我目前正在尝试理解mpi4py。我设置了和,因为我不明白为什么我们想要自动初始化和终结。默认行为是在导入MPI时调用。我认为这样做的原因是,对于每个等级,都运行了一个python解释器实例,每个实例都将运行整个脚本,但这只是猜测。最后,我喜欢把它说清楚。 现在这引入了一些问题。我有这个密码 导致 我对这里发生的事情有点困惑。如果我移动在析构函数的末尾,它可以正常工作。 并不是说我也使用h5py,它

  • 问题内容: 这两个类别有何不同? 有什么明显的区别吗? 问题答案: 是一个 类变量 。 的是一个 实例变量 。 即的被实例之间共享。 用可以像列表这样修改的东西更容易证明区别: 输出量

  • 我目前正在尝试理解mpi4py。我设置了和,因为我不明白为什么我们想要自动初始化和终结。默认行为是在导入MPI时调用。我认为这样做的原因是,对于每个等级,都运行了一个python解释器实例,每个实例都将运行整个脚本,但这只是猜测。最后,我喜欢把它说清楚。 现在这引入了一些问题。我有这个密码 导致 我对这里发生的事情有点困惑。如果我移动到解构函数的末尾,它可以正常工作。 并不是说我也使用h5py,它

  • 问题内容: 有什么用的,并在Hibernate?因为我在互联网上发现的每个示例都将数据插入到单个表中,并使用两个不同的类来做到这一点。我的观点是,如果我使用单个表,那么我可以在单个类中映射所有列,那么为什么要使用不同的类。如果我们使用两个不同的表,则存在和hibernate关系。 问题答案: Hibernate 1中有两种对象。Value Object2 。实体 价值对象 是不能独立存在的对象。以

  • 我们为什么使用: 而不是: ?

  • 我已经和Java一起工作了几年,但是直到最近我还没有遇到过这个结构: 这可能是一个非常简单的问题,但是有人能解释一下吗?我怎么读?我很确定我知道它是如何工作的。 < li >如果< code>isHere为true,则调用< code>getHereCount(), < li >如果< code>isHere为false,则调用< code>getAwayCount()。 正确吗?这个构造叫什么?