Perl是否具有遵循最佳实践的枚举类型,或者更重要的是,它是否需要一个?
我正在工作的项目使用遍布各处的字符串来表示通常在C#等语言中使用Enum的内容 . 例如,我们在一组哈希中有一组电话号码,每个电话号码与电话类型(“主页”,“工作”,“移动”等)相关联:
$phone_number->{type} = 'Home';
在这里使用只读变量集还是使用Enum是否足够?我找到了一个enum module on CPAN但它似乎使用了违反其中一个Perl Best Practices的裸字 . 我对使用read-only variables的想法是这样的:
use Readonly;
Readonly my $HOME => 'Home';
Readonly my $WORK => 'Work';
Readonly my $MOBILE => 'Mobile';
$phone_number->{type} = $HOME;
这是一个好方法还是有更好的方法?
6 回答
不,没有内置的枚举构造 . Perl没有做很多严格的打字,所以我认为实际上并不需要一个 .
在我看来,你使用的Readonly方法是可靠的 .
还有更传统的constant pragma .
在幕后,它为每个返回值的常量设置一个函数,就像这样 .
除非你想利用那个属性,否则我会坚持Readonly,例如:
实际上Perl确实有像C一样的枚举类型 . 试试这个细节 .
perldoc enum
例如:
现在我们有:
您也可以自己设置indeces:
现在我们有:
请查看here了解更多详情 .
请注意,每个Perl版本都不支持此功能 . 我知道v5.8.3不支持它,而v5.8.7则支持它 .
Perl本身不支持该概念,但有一些模块可以添加此功能
https://metacpan.org/pod/enum
你的方式绰绰有余 .
如果您正好使用Moose,也可以使用Moose :: Util :: TypeConstraints创建枚举 . (你应该是哪个 . )
我担心perl在这些枚举和命名常量时是完全截瘫的:
枚举和Readonly不是核心模块(至少在perl 5.8,我刚检查过) . 因此,在没有安装新模块的自由的系统上,这些可能是不可用的 .
“使用常量”和“使用严格”(一个应该总是使用)是完全不可用的,因为它会生成一堆形式的可怕错误消息:
使用“严格潜艇”时不允许使用Bareword“FRED”
让我们希望他们已经在perl 6中解决了这个烂摊子,如果它能看到光明的那一天!
这对我很有用......
然后,您可以使用
ZERO, ONE, TWO
等作为常量,并使用(MYENUM)[$value]
打印出它们的符号名称 .