5 votes

Comment puis-je référencer la classe actuelle comme type de retour dans YARD ?

Considérez un code comme celui-ci :

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

Avec ça, Bar.new.returns_new_self retournera un autre Bar et il en va de même pour Zap.new.returns_new_self .

Je veux avoir retuns_new_self YARD-documenté avec un type de retour.
Ce serait bien si je pouvais faire quelque chose comme @return [Self] comme le Self dans Rust.

Puis-je faire quelque chose de similaire ?


EDIT : (en réponse à @spickermann)

Le code actuel est le suivant :

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)

Je comprends que cela s'écarte un peu de la POO (il est préférable de diviser cet élément en un conteneur et les éléments concrets),
mais comme c'est un tas de choses identiques, et que c'est déjà la façon dont c'est stocké dans la base de données, j'ai décidé que je voulais retourner un énumérateur comme ceci.


EDIT 2 : Je passe le --embed-mixin option vers la cour. Le résultat actuel dans le document includer Class est le suivant : (désolé pour le nom de module différent) The details part of <code>Bar</code>

1voto

Richard-Degenne Points 1798

Malheureusement, YARD ne peut pas faire ça. La meilleure alternative est d'être explicite dans votre Foo#returns_new_self documentation. Personnellement, je serais tout à fait d'accord avec quelque chose de l'ordre de

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

Ce qui donne le document suivant :

foo documentation bar documentation

1voto

anothermh Points 3404

Yardoc ne génère pas de documentation de la manière que vous décrivez.

Lorsque vous générez la documentation, Bar y Zap aura une section qui dit :

Méthodes incluses à partir de Foo

#returns_new_self

#returns_new_self permettra d'accéder à la documentation de Foo et la documentation pour Foo indique les types de retour possibles pour cette méthode. Les classes individuelles n'auront pas de documentation pour cette méthode.

Vous pouvez toujours documenter returns_new_self à l'intérieur de Foo . La définition du type de retour à l'une des valeurs suivantes est considérée comme valide :

Une liste codée en dur des valeurs des classes qui incluent le module :

# @return [Bar,Zap]

Une superclasse des classes qui incluent le module :

# @return [Object]

El littéral void pour un type de retour non défini :

# @return [void]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X