Ruby带?后缀方法用于返回[:ok]/[:error]的模式匹配是否有公认规范?
Ruby 问号结尾方法的社区规范说明
Ruby 社区当前公认的编码风格约定里,? 结尾方法的核心设计规则是:返回值的真假语义要和方法名的疑问语义完全匹配,可直接用于 if/unless 等条件判断场景,具体可以拆成几个层面解释:
- 传统惯例的核心要求:不需要严格返回
true/false,但返回值必须满足「符合方法名的肯定语义时为真值,不符合时为假值」,比如 Rails 中的exists?方法早期版本会返回匹配的主键值或nil,依然符合这个要求,不会误导调用者。 - 你提到的返回
[:ok]/[:error, 错误信息]结构的用法,不符合社区通用规范:因为两种返回值都是真值,调用者如果按照常规习惯写if authorization_valid?做判断,不管校验成功还是失败都会走if分支,极容易引发逻辑bug,属于典型的反模式。 - 同类需求的推荐写法:
- 拆分两个方法:保留
?结尾的方法返回布尔值供条件判断使用,额外加一个不带?后缀的方法返回详细结果供模式匹配使用,比如加一个check_authorization方法返回状态数组 - 直接去掉
?后缀:给方法起更贴合返回值的名称,比如authorization_check_result,调用者看到名称就知道它不是单纯的布尔判断方法,不会直接用于条件判断。
- 拆分两个方法:保留
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

