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

定义可通过方法语法调用的子例程

糜宜民
2023-03-14

可以通过函数语法调用sqrt:

> sqrt 16
4

也可以通过方法语法调用:

> 16.sqrt
4

有没有办法让用户定义的子例程可以通过方法语法调用?

例如,让我们定义sq:

> sub sq(Int $n) { $n*$n }
sub sq (Int $n) { #`(Sub|64042864) ... }
> sq 4
16

有没有一种方法可以使它作为方法可调用?即。

> 4.sq

共有2个答案

夏侯渊
2023-03-14

您可以使用monkey键入来增加Int。期待乐观主义者退出,你的意志/乳房缩小,世界总的来说会结束。猴子打字是邪恶的。除非必要,否则不要使用它。

use MONKEY-TYPING; 
augment class Int { method sq(Int:D $i:){ $i * $i } };
my Int $i = 4;
say $i.sq;

可以将角色混入对象。请注意,对象是对象,而不是类Int,也不是容器$i。

my $i = 4 but role :: { method sq(Int:D $i:){ $i * $i } };
say $i.sq;

您可以创建一个自由浮动方法并使用

my method sq(Int:D $i:){ $i * $i };
my $i = 4;
say $i.&sq;

编辑:

如果你真的想打破假设,你甚至可以访问私有属性。

class Foo { has $!bar = 'meow'; };
use MONKEY-TYPING;
augment class Foo { method baz { say $!bar } };
Foo.new.baz
# OUTPUT«meow␤»

毋承基
2023-03-14

有没有办法让用户定义的子例程可以通过方法语法调用?

是的,只需使用

625.&sqrt.say
# 25

invocant作为第一个参数传递:

sub sq { $^a² }; say 4.&sq
4.&sq.say
# 16

唯一的问题是,如果要将方法链分解为多行,则必须使用unspace:

4.&sq\
 .&sq.say;

 类似资料:
  • 问题内容: 我有这样的代码: 为什么我不能在第(5)行中打电话;在第(6)行中将为哪个类调用? 问题答案: 您不能这样做,因为子类的方法不在您的超类中。在这种情况下,尽管String是Object的子类,因为在java.lang.Object类中未声明length(),但无法在其实例上调用length。 但是equals()方法在字符串类中被覆盖,因此将调用Strings的equals()

  • 你的c#示例https://graph.microsoft.com/v1.0/me/people?$search=“jesper” 我得到的错误是: 不确定这是否是注定要发生的,但似乎是错误的,你不能使用搜索功能https://developer.microsoft.com/en-us/graph/graph-explorer

  • 问题内容: 不知道为什么这不起作用。我相信你们都知道我在这里想要达到的目标。 当脚本运行时,我得到一个参考,它引用了这段代码: 我正在使用codeigniter2框架,因此如果我的表单页面对某些人没有意义,则表示歉意。 new_page.php(相关位) 并在new_page.validation.js中 任何帮助将不胜感激!欢呼的家伙 问题答案: 可能会破坏插件的正常运行。根据文档, “布尔tr

  • 根据JAVA 8提供的新特性,可选类是防止空指针异常的一种方法。如果输出为null,我们可以使用orelsethow方法()引发异常。我想知道如何使用它抛出用户定义的异常

  • 问题内容: 如果我在字符串中有一个对象和一个方法名称,该如何调用该方法? 问题答案: 使用内置功能: 您还可以用于通过名称设置类属性。

  • 问题内容: 我正在尝试对页面登录进行编码,但在此错误中我处于停止状态 PLIZ在这里告诉我错了事 问题答案: 用于准备的语句。例如 您正在尝试直接在主数据库对象上执行查询。对于PDO,这意味着 您确实应该研究准备好的语句。您很容易受到SQL注入攻击的影响,并且由于您从一开始就使用PDO,因此不编写安全查询基本上是不可原谅的。