能否使用YARD将@return类型声明为某一参数的实例类型?
问题
我想要实现的核心功能如下:
# @param [class] cls # @return [instanceof(cls)] def get(cls) # 假设该方法所属对象有 @instances = {} 属性 if !@instances.keys.include?(cls) @instances[cls] = cls.new() end @instances[cls] end
这种写法在服务容器模式中十分实用,例如:
service = container.get(MyClass) # 语言服务器(如solargraph)会识别 service 变量的类型为 MyClass
请问是否可以通过YARD实现该功能?
更新:修复了函数示例,此前该函数仅返回cls.new()
答案
可以通过YARD的动态类型语法或自定义类型注解实现该需求,以下是两种可行方案:
方案一:使用YARD内置动态类型语法
YARD支持在类型注解中嵌入Ruby表达式,直接基于入参声明返回类型,语言服务器可直接识别:
# @param cls [Class] 要获取实例的目标类 # @return [#{cls}] 返回传入类的单例实例 def get(cls) @instances ||= {} @instances[cls] ||= cls.new end
这种写法无需额外配置,Solargraph等工具能直接推断container.get(MyClass)返回变量的类型为MyClass,自动补全、类型检查功能均可正常工作。
方案二:自定义类型别名(进阶)
如果需要更统一的类型标识,可结合YARD扩展机制自定义类型:
- 在项目的
.yardopts或自定义YARD插件中注册类型处理器 - 使用自定义类型注解标记方法:
# @param cls [Class] # @return [Instance<cls>] def get(cls) @instances ||= {} @instances[cls] ||= cls.new end
注意:这种方式需要确保所用语言服务器(如Solargraph)支持自定义类型解析,部分工具可能需要额外配置。
内容的提问来源于stack exchange,提问作者idchlife
相关产品推荐
相关产品推荐

