Как я могу ссылаться на текущий класс как тип возвращаемого значения в YARD? - PullRequest
3 голосов
/ 24 мая 2019

Рассмотрим код, подобный этому:

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 вернет еще один Bar, и то же самое будет с Zap.new.returns_new_self.

Я хочу получить документацию retuns_new_self YARD с типом возврата.
Было бы хорошо, если бы я мог сделать что-то вроде @return [Self] как Self в Rust.

Могу ли я сделать что-то подобное?


РЕДАКТИРОВАТЬ: (в ответ на @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)

Я понимаю, что это немного отличается от ООП (лучше разделить этот Предмет на Контейнер и конкретные Предметы),
но поскольку это куча одних и тех же вещей и то, как они уже хранятся в БД, я решил, что хочу вернуть перечислитель, подобный этому.


РЕДАКТИРОВАТЬ 2: Я передаю опцию --embed-mixin во двор. Текущий результат в документе класса включения выглядит так: (извините за другое имя модуля) imageBar">

Ответы [ 2 ]

1 голос
/ 24 мая 2019

yardoc не генерирует документацию так, как вы описываете.

Когда вы генерируете документацию, Bar и Zap будет иметь раздел, который гласит:

Методы, включенные в Foo

#returns_new_self

#returns_new_self, будут ссылаться на документацию для Foo, а документация для Foo будет указывать возможный возвраттипы для этого метода.Отдельные классы не будут иметь документации для этого метода.

Вы можете документировать returns_new_self внутри Foo.Установка типа возвращаемого значения для любого из следующих значений будет считаться действительным:

Жестко закодированный список значений из классов, включающих модуль:

# @return [Bar,Zap]

Суперкласс классов, включающих в себямодуль:

# @return [Object]

Литерал void для неопределенного типа возвращаемого значения:

# @return [void]
1 голос
/ 24 мая 2019

К сожалению, ЯРД не может этого сделать.Лучшая альтернатива - явное указание в вашей 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

, что дает следующий документ:

foo documentation bar documentation

...