Perl是否具有遵循最佳实践的枚举类型,或者更重要的是,它是否需要一个?
我正在工作的项目使用遍布各处的字符串来表示通常在C#等语言中使用Enum的内容.例如,我们在一组哈希中有一组电话号码,每个电话号码与电话类型("主页","工作","移动"等)相关联:
$phone_number->{type} = 'Home';
Run Code Online (Sandbox Code Playgroud)
在这里使用只读变量集还是使用Enum是否足够?我enum
在CPAN上找到了一个模块,但似乎使用了违反Perl最佳实践之一的单词.我对使用只读变量的想法是这样的:
use Readonly;
Readonly my $HOME => 'Home';
Readonly my $WORK => 'Work';
Readonly my $MOBILE => 'Mobile';
$phone_number->{type} = $HOME;
Run Code Online (Sandbox Code Playgroud)
这是一个好方法还是有更好的方法?
Ron*_*hke 44
不,没有内置的枚举构造.Perl没有做很多严格的打字,所以我认为实际上并不需要一个.
在我看来,Readonly
你使用的方法是坚实的.
还有更传统的constant
pragma.
use constant {
HOME => 'Home',
WORK => 'Work',
MOBILE => 'Mobile',
};
$phone_number->{type} = HOME;
Run Code Online (Sandbox Code Playgroud)
在幕后,它为每个返回值的常量设置一个函数,就像这样.
sub HOME () { 'Home' }
Run Code Online (Sandbox Code Playgroud)
Readonly
除非你想利用那个属性,否则我会坚持下去,例如:
package Phone::Type;
use constant {
HOME => 'Home',
#...
};
package main;
print Phone::Type->HOME, "\n";
Run Code Online (Sandbox Code Playgroud)
Nat*_*man 25
实际上Perl确实有像C一样的枚举类型.试试这个细节.
例如:
use enum qw(HOME WORK MOBILE);
Run Code Online (Sandbox Code Playgroud)
现在我们有:
HOME == 0
WORK == 1
MOBILE == 2
Run Code Online (Sandbox Code Playgroud)
您也可以自己设置indeces:
use enum qw(HOME=0 WORK MOBILE=10 FAX);
Run Code Online (Sandbox Code Playgroud)
现在我们有:
HOME == 0
WORK == 1
MOBILE == 10
FAX == 11
Run Code Online (Sandbox Code Playgroud)
看这里了解更多详情.
请注意,每个Perl版本都不支持此功能.我知道v5.8.3不支持它,而v5.8.7则支持它.
小智 5
我担心perl在这些枚举和命名常量时是完全截瘫的:
enum和Readonly不是核心模块(至少在perl 5.8,我刚刚检查过).因此,在没有安装新模块的自由的系统上,这些可能是不可用的.
"使用常量"和"使用严格"(一个应该总是使用)是完全不可用的,因为它会生成一堆形式的可怕错误消息:
使用"严格潜艇"时不允许使用Bareword"FRED"
让我们希望他们已经在perl 6中解决了这个烂摊子,如果它能看到光明的那一天!