gpt4 book ai didi

inheritance - 我怎样才能在 Perl 6 中重新启用一个对象?

转载 作者:行者123 更新时间:2023-12-04 03:06:28 26 4
gpt4 key购买 nike

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

我真的有两个问题,但它们都来自我正在玩的同一件事。

首先,当我想进一步限制它时,我可以制作一个类型的子集。我用 MyInt 做到这一点它接受任何 Int .我声明一个变量 to 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;

我可以覆盖 new (直接取自 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;

我可以 bless self ,但这并没有保留值(我认为它不会也不认为它应该。看着 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

最佳答案

这是一个可能的解决方案:

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

产生:
MyInt $x = 42

可能有一种更清洁的方式来做你想做的事,但我不知道它是什么。

重要更新 Raku rebless doesn't work with inhertited classes anymore .

关于inheritance - 我怎样才能在 Perl 6 中重新启用一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44486985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com