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

如何在Perl 6中删除对象?

陶朝明
2023-03-14

另一个问题可能是“如何从内置类型继承?”。

我真的有两个问题,但它们都来自我玩的同一个东西。

首先,当我想进一步约束类型时,我可以创建它的子集。我用MyInt来做这件事,它接受任何Int的东西。我将一个变量声明为by MyInt并赋值给它,但当我检查它的名称时,得到的却是Int。那么,这是怎么回事?

subset MyInt where * ~~ Int;

my MyInt $b = 137;
put 'Name: ', $b.^name;  # Int, but why not MyInt?

但是,我真正想要的是一个名为MyInt的类,它做同样的事情。我可能想添加方法到

class MyInt is Int {}   # empty subclass

my MyInt $b = 137;
put 'Name: ', $b.^name;

这看起来很有效,但我有一个错误:

Type check failed in assignment to $b; expected MyInt but got Int (137)

我明白它在说什么,但不明白为什么我在使用subset时没有得到相同的错误。这是问题1.5。

我真正想要的是137的赋值,当我赋值时,它会自动变成MyInt。我知道我可以显式地构造它,但父类仍然将其转换为Int而不是使用派生类型的类型,这有点恼人:

class MyInt is Int {}   # empty subclass

my MyInt $b = MyInt.new: 137;  # Still an Int
put 'Name: ', $b.^name;

我可以覆盖新的代码(直接从Int.pm获取),但我无法更改类型:

class MyInt is Int {
    method new ( $value --> MyInt ) {
        my $v = callsame; # let superclass construct it
        # But, how do I make it the more specific type?
        }
    }

my MyInt $b = MyInt.new: 137;  # Still an Int
put 'Name: ', $b.^name;

我可以祝福自己,但这并没有保留该值(我认为它不会也不应该保留该值。查看Int.pm,我看不出它是如何存储该值的。它看起来依赖于内置类型,可能不是传统的子类:

class MyInt is Int {
    method new ( $value --> MyInt ) {
        my $v = callsame; # let superclass construct it
        put "v is $v";
        # But, how do I make it the more specific type?
        # $v.bless (doesn't change the type, fails return type check)
        self.bless;  # doesn't retain value
        }
    }

my MyInt $b = MyInt.new: 137;  # Still an Int
put 'Name: ', $b.^name;
put 'Value: ', $b;  # 0

有一个rebless,但它不是可用于Int或ClassHow的事物链的一部分:

class MyInt is Int {
    method new ( $value --> MyInt ) {
        my $v = callsame; # let superclass construct it
        put "v is $v";
        put "self is " ~ self.^name;
        put "HOW is " ~ self.HOW.^name;
        # No such method 'rebless' for invocant
        # $v.rebless: self.^name;
        $v.HOW.rebless: self.^name;
        }
    }

my MyInt $b = MyInt.new: 137;  # Still an Int
put 'Name: ', $b.^name;
put 'Value: ', $b;  # 0

共有1个答案

巴洲
2023-03-14

以下是一个可能的解决方案:

class MyInt is Int { };
my $x = 42;
Metamodel::Primitives.rebless: $x, MyInt;
dd $x;

其产生:

MyInt $x = 42

也许有一种更干净的方式来做你想做的事,但我不知道它是什么。

重要更新请参阅Raku重新祝福不再适用于继承的类。

 类似资料:
  • 问题内容: 假设我有以下结构: 如果我将该结构作为对象 如果我将此对象设置为nil 它不起作用,实际上是类型分配错误,但适用于映射和切片。那么,我将如何删除该对象(即取消分配)呢?我查看了内置的delete文档,但它从给定的映射中删除了一个条目。谢谢。 问题答案: Go是一种垃圾收集语言。您不应该这样做,也不能从内存中删除对象。这样做是垃圾收集器的 职责 和 责任 ,并且它是 自动执行的 。当对象

  • 问题内容: 我对JavaScript的运算符有些困惑。采取以下代码: 执行完这段代码后,is ,但仍指与完全相同的对象。我猜这个对象是指向相同的对象。 这使我感到困惑,因为我希望写操作可以删除指向内存中的对象,而不仅仅是变量。 这是因为JavaScript的垃圾回收工作在保留/释放的基础,所以,如果我没有指向对象的任何其他变量,它 会 从内存中清除? (顺便说一下,我的测试是在Safari 4中完

  • 我如何删除Linkedlist中的对象。我有一个类帐户,里面有学生ID和学生名称。我输入列表中的对象,但是当我试图删除时,我不知道如何做。因为每次你从列表中间删除一个元素,它就会变得有组织,这意味着索引会改变。所以我如何获得学生ID属性并删除LinkedList中的对象。 样本: 我想让用户插入他想要删除的studentId,我可以做一个搜索和删除该对象的代码。 每次我从中间删除一个对象,它就会改

  • 这段代码运行良好,但我想知道它的性能,我指的是它的总体时间复杂度?

  • 问题内容: 说我创建一个对象,如下所示: 删除该属性以使其最终成为new 的最佳方法是什么? 问题答案: 像这样: 演示版

  • 问题内容: 我正在尝试从ArrayList中删除一个对象。每个Item对象都有3个属性;1. itemNum 2.信息3.费用。我也有3个类,即1。Item类定义了存储在目录中的单个项目。2. Catalog类维护Item对象的列表。3带main方法的客户端类。我在Set类中具有设置并获取,在Catalog中具有ArrayList。在客户端中,提示我“输入要删除的itemNum。如何基于对item