You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用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扩展机制自定义类型:

  1. 在项目的.yardopts或自定义YARD插件中注册类型处理器
  2. 使用自定义类型注解标记方法:
# @param cls [Class]
# @return [Instance<cls>]
def get(cls)
  @instances ||= {}
  @instances[cls] ||= cls.new
end

注意:这种方式需要确保所用语言服务器(如Solargraph)支持自定义类型解析,部分工具可能需要额外配置。

内容的提问来源于stack exchange,提问作者idchlife

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:10:34