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

方法可以作为常规子例程处理吗?

云宝
2023-03-14

是否可以将方法分配给变量,并将它们作为类内的参数传递,类似于子例程?

我知道它们可以通过self访问 自我 (或任何名为显式invocant的)在其他方法中,但我想知道是否可以将方法的代码对象作为参数传递给另一个方法。


共有2个答案

卢景澄
2023-03-14

根据方法是作用域(几乎所有的方法都有)还是我的作用域,有两种通用机制可以作为一级公民(可以作为参数传递的东西)来获取方法。

绝大多数方法都保存在类中,并在没有显式范围声明器的情况下声明。这些都(隐式地)的作用域都是包含它们的类。

要将has作用域方法作为参数传递,需要找到它。查找操作必须相对于包含该方法或从包含该方法的类继承的某个类启动。即使您知道该方法就在启动查找操作的类中,这也是正确的。有三种选择:

>

在极少数情况下,您可能需要使用^改为查找符合条件的方法。这将在MRO上比发票人的类更高的位置开始搜索。

为了完整起见,我还会包含一个方法:.^lookup。但是阅读文档中的警告。您几乎肯定不应该使用这个方法,特别是如果您想做的是调用这个方法。使用其中一个.^find_method...方法代替。

因此:

.has-way given class {
  method has-way { my $m = self.^find_method: 'm'; self.m-as-arg: $m }
  method m-as-arg ($m) { say self.$m } # has way
  method m { 'has way' }
}

一些方法没有的作用域,而是用my声明。

对于这些词汇方法,将它们作为参数传递的机制是简单地用前缀引用它们

因此:

.my-way given class {
  method my-way { self.m-as-arg: &m }
  method m-as-arg ($m) { say self.$m }     # my way
  my method m { 'my way' }
}

程鸿煊
2023-03-14

您是否考虑过传递方法的名称?

class Foo {
    method bar($a) { dd $a }
}
my $name = "bar";
Foo."$name"(42);  # 42

该语法需要字符串化和括号来表示您要调用该方法。如果您真的想使用方法对象并传递它,您可以,但没有真正好的语法:

class Foo {
    method bar($a) { dd $a }
}
constant &B = Foo.^find_method("bar");
B(Foo, 42)  # 42

在这个例子中,常量

my $name = "bar";
my $method = Foo.^find_method($name);
$method(Foo, 42);

然而,在这种情况下,使用可能会更好。“$name”(语法。看见https://docs.raku.org/routine/find_method了解更多信息。

 类似资料:
  • 本文向大家介绍unity3d 可以作为协程的MonoBehaviour方法,包括了unity3d 可以作为协程的MonoBehaviour方法的使用技巧和注意事项,需要的朋友参考一下 示例 可以将三种MonoBehaviour方法制成协程。 Start() OnBecameVisible() OnLevelWasLoaded() 例如,这可用于创建仅在摄像机可见对象时执行的脚本。        

  • 下面考虑一个简单异常处理例子。图 13.1 的程序用 try、throw 和 catch 检测除数为0的异常情况,表示并处理除数为0的异常。 1 // Fig. 13.1:fig13_01.cpp 2 // A simple exception handling example. 3 // Checking for a divide-by zero exception. 4 #include <i

  • 本文向大家介绍AngularJS模块管理问题的非常规处理方法,包括了AngularJS模块管理问题的非常规处理方法的使用技巧和注意事项,需要的朋友参考一下 1.起因 自己一直做winform,有幸从某个大神手里接了一个node.js,express,angularJS等集众多开源框架的一个项目,赶鸭子上架,于是一边学习,一边用自己以往的思中去整理,重构代码; 2.问题 在某几个环境下,需要用Boo

  • 本文向大家介绍Nodejs处理异常操作示例,包括了Nodejs处理异常操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Nodejs处理异常操作。分享给大家供大家参考,具体如下: Exception.js optfile.js router.js 希望本文所述对大家nodejs程序设计有所帮助。

  • 问题内容: 考虑以下代码: 您希望它能打印,但是会引发,这是我试图避免的错误。那么可以使用块来处理所有异常吗?好吧,如果是例外,为什么它包含在内置例外中?最后我该如何修复上面的代码,使其正确处理异常? 注意:我知道我要做什么完全没有意义,也没有真正的目的 问题答案: 是一个完全普通的内置异常。这一点都不特殊。仅在(通常)抛出时的情况有点不寻常。 语法错误意味着 无法解析 具有该错误的代码。它甚至没

  • 问题内容: 我有一个基于电子表格的自动报告,需要每天创建,其中包含一些图表,汇总功能(例如SUM和AVERAGE)和格式化的单元格(日期,百分比等)。 我试图将这些结果直接写到Excel文件中,但是Python的xlwt和xlrd不支持图表和函数。 此外,尝试打开现有的格式化Excel文件并更改某些单元格的值最终导致擦除了现有文件中的所有图表和功能。 是否可以将图表和功能写入OpenOffice电