如何在 YARD 中将当前 class 引用为 return 类型?

How can I reference the current class as a return type in YARD?

考虑这样的代码:

module Foo
  # returns a copy of self
  # @return [ ___ ]
  def returns_new_self
    self.class.new
  end
end

class Bar
  include Foo
end

class Zap
  include Foo
end

有了这个,Bar.new.returns_new_self 将 return 另一个 BarZap.new.returns_new_self 也是如此。

我想要 retuns_new_self YARD 记录为 return 类型。
如果我能像 Rust 中的 Self 一样做类似 @return [Self] 的事情就好了。

我可以做类似的事情吗?


编辑:(回复@spickermann)

实际代码是这样的:

module MultipleItemBehaviour
  # @return [Integer]
  def count; not_implemented end

  # @return [Enumerator]
  def each_count
    return enum_for(:each_count) unless block_given?

    count.times do
      yield single_item
    end
  end

  # @return [ __SELF__ ]
  def single_item; not_implemented end

  private def not_implemented
    raise NotImplementedError, "message"
  end
end

class SomeItemWhichIsABunch
  include MultipleItemBehaviour

  attr_reader :count
  def initialize(count)
    @count = count
  end

  def single_item
    self.class.new(1)
  end
end

SomeItemWhichIsABunch.each_count.take(5).map(&:something)

我知道这有点偏离 OOP(最好将该项目拆分为容器和具体项目),
但由于它是一堆相同的东西,而且它已经是存储在数据库中的方式,所以我决定 return 像这样的枚举器。


编辑 2: 我正在将 --embed-mixin 选项传递给院子。 includer Class 文档中的当前结果是这样的:(抱歉模块名称不同)

遗憾的是,YARD 无法做到这一点。最好的选择是在您的 Foo#returns_new_self 文档中明确说明。就个人而言,我完全可以接受

module Foo
  ##
  # Returns a new instance of the object's class.
  #
  # @return [Object]
  def returns_new_self
    self.class.new
  end
end

class Bar
  include Foo
end

class Zap
  include Foo
end

生成以下文档:

yardoc 不会按照您描述的方式生成文档。

当您生成文档时,BarZap 将有一个部分显示:

Methods included from Foo

#returns_new_self

#returns_new_self 将 link 添加到 Foo 的文档中,而 Foo 的文档将说明该方法可能的 return 类型。个人 类 将没有该方法的文档。

您仍然可以在 Foo 中记录 returns_new_self。将 return 类型设置为以下任何一种都将被视为有效:

来自 类 的 hard-coded 值列表,其中包括模块:

# @return [Bar,Zap]

包含模块的 类 的超类:

# @return [Object]

未定义的 return 类型的 literal void:

# @return [void]