约束类属性的推荐方法?以文件路径属性校验为例
Raku类中文件路径属性的校验方案选择
我需要实现一个包含文件路径字符串属性的类,核心要求如下:
- 构造对象前必须确保文件存在
- 未来可能需要扩展额外校验逻辑(比如文件格式合规性)
- 文件不存在时需抛出描述性异常
我已经尝试了几种实现方式,具体如下:
已尝试的方案
方案一:属性绑定自定义检查函数
这种方式将校验逻辑直接写在属性定义旁,能抛出清晰的异常:
unit class Vim::Configurator; sub file-check($file) { die (X::IO::DoesNotExist.new(:path($file), :trying('new'))) if !$file.IO.f.Bool; return True; } has Str:D $.file is required where file-check($_);
方案二:在new/build方法中实现校验
这种传统方式可行,但不符合我希望将属性校验逻辑紧邻属性定义的偏好。
方案三:where子句直接写简洁条件
写法非常简洁,但抛出的错误信息极为晦涩,不利于调试:
has Str:D $.file is required where *.IO.f.Bool == True;
方案四:使用subset定义约束类型
这种方式的错误信息不够友好,且写法感觉生硬怪异:
subset Vim::Configurator::File where *.IO.f.Bool == True; unit class Vim::Configurator; has Vim::Configurator::File $.file is required;
想请教社区大家的常用方案,是否存在比上述方法更优的实现选择?
内容的提问来源于stack exchange,提问作者StevieD
相关产品推荐
相关产品推荐

