首页 > 解决方案 > 是否可以在 Raku 的类之外访问静态方法和属性?

问题描述

在 raku 中,似乎可以定义静态方法(通过sub关键字)和静态属性(通过my),它们可以在同一个类中引用。

但是,是否可以在类之外访问这些方法和属性?

与此类似的东西:

class MyClass {
    my $attribute = 123;
    sub my-method {
        say 'Hello';
    }
}

MyClass.$attribute;
MyClass.my-method;

标签: classmethodsstaticattributesraku

解决方案


似乎可以定义静态方法(通过sub关键字)和静态属性(通过my)它们可以在同一个类中引用。

我明白你为什么称它们为静态方法和属性,但 Raku 有一个更简单的解决方案:

class MyClass {        
    method my-method {
        say 'Hello';
    }
    method attribute is rw {
      state $attribute = 123
    }
}

say MyClass.attribute;   # 123
MyClass.attribute = 99;
say MyClass.attribute;   # 99
MyClass.my-method;       # Hello

可以使用our subs 和our变量。our是用于定义词法的声明符,该词法可在声明它的包之外使用。( mys从不共享;sub没有 an 的声明符ourmy sub.)

所以:

class MyClass {        
    our sub my-sub {
        say 'Hello';
    }
    our $attribute = 123
}
import MyClass;
say $MyClass::attribute;   # 123
$MyClass::attribute = 99;
say $MyClass::attribute;   # 99
MyClass::my-sub;           # Hello

如您所见,这些不是方法。在先前的解决方案没有的意义上,这种方法忽略了 OOP。


推荐阅读