代码之家  ›  专栏  ›  技术社区  ›  Eugene Barsky

在Perl 6中声明属于用户定义类的变量

  •  9
  • Eugene Barsky  · 技术社区  · 8 年前

    当我声明一个值属于内置类的变量时,我只需编写

    my Int $a;
    

    但是当我想使用用户定义的类时,我 have to use Classname.new .

    my class House {
        has $.area is rw;
    }
    
    my $house1 = House.new;
    $house1.area = 200;
    say $house1.area;
    

    所以,我的首要问题是,造成这种差异的原因是什么?为什么我们不能简单地写 my House $house1 ?

    我的最终目标是使用一个数组,其值是用户定义类的实例。我如何才能正确执行以下操作?

    my @houses ...;
    @houses[10].area = 222;
    
    3 回复  |  直到 7 年前
        1
  •  13
  •   Elizabeth Mattijsen    6 年前

    my House $a 与相同 my Int $a . 它对可以放入其中的值进行了限制。如果查看变量的内容,就会得到该限制的类型对象。

    那里 House 位: my House $a .= new ,相当于 my House $a = House.new .

    回到你的问题:是的,你可以用一些麻烦做到这一点:

    class House {
        has $.area;
        multi method area(House:U \SELF:) is raw {
            (SELF = House.new).area
        }
        multi method area(House:D:) is raw {
            $!area
        }
    }
    my House @houses;
    @houses[2].area = 42;
    say @houses  # [(House) (House) House.new(area => 42)]
    

    我们为访问器方法创建了两个候选对象:一个接受未定义的类型对象,另一个接受实例化对象。第一个修改其invocant(假设它是一个可以设置的容器),然后调用该方法的实例化版本。我将把它作为一个练习留给读者,让他们把它变成一个 Attribute 特质

        2
  •  3
  •   Curt Tilmes    8 年前

    当你写作时 my Int $a; 您将有一个类型为的变量 Int ,但没有价值,甚至没有容器。具体价值 $a (Int) .

    与相同 my House $house; -你会得到 (House) 价值

    在您的情况下,您必须通过一些房屋值初始化数组的元素。例如:

    my @houses = House.new() xx 11;
    @houses[10].area = 222;
    
        3
  •  3
  •   brian d foy    8 年前

    我认为你错过了编译器为你做的部分工作。当您有文字数字时,解析器会识别它并为其构造正确的数字对象。有一个虚拟的和看不见的 Int.new() 这已经发生在你身上了 rakudo/src/Perl6/Actions.nqp . 这是在NQP级别,但这是相同的想法。