2015-05-23 17 views
7

Ho un metodo che dovrebbe prendere 1+ parametri di qualsiasi classe, simile a Array#push:Il modo migliore per documentare il parametro "splattato" con YARD?

def my_push(*objects) 
    raise ArgumentError, 'Needs 1+ arguments' if objects.empty? 
    objects.each do |obj| 
    puts "An object was pushed: #{obj.inspect}" 
    @my_array.push obj 
    end 
end 

Qual è il modo migliore per documentare i parametri del metodo utilizzando la sintassi YARD?

Edit:

mi rendo conto che la mia domanda iniziale era un po 'troppo vaga e non riusciva a specificare quello che stavo cercando.

Una domanda migliore sarebbe, qual è il modo migliore per specificare l'arità di un metodo (1-∞ in questo caso) in YARD quando si utilizza un parametro splattato? So che potrei semplicemente specificarlo nel testo, ma sembra che ci sia dovrebbe essere un tag o qualcosa di simile a specificare l'arità.

risposta

7

Il creatore di YARD, lsegal, afferma che the appropriate thing to do is provide an @overload for expected invocations. Tuttavia, questo non fornisce molta chiarezza nel caso di un metodo Array#push -like.

Suggerisco di utilizzare il tag @param e di utilizzare Array<Object> come tipo di argomento o di fornire un @overload bello.

Ecco un confronto tra i due:

class Test 
    # A test method 
    # 
    # @param [Array<Object>] *args Any number of Objects to push into this collection 
    # @return nil 
    def push(*args); end 

    # Another test method 
    # 
    # @overload push2(obj, ...) 
    # @param [Object] obj An Object to push 
    # @param [Object] ... More Objects 
    def push2(*args); end 
end 
+3

Ho aggiornato la mia domanda per essere un po 'più specifico. L'unico problema con 'Array ' è che implica che una lista vuota di parametri sia accettabile. '@ overload' sembra essere più utile per specificare invocazioni di metodi diversi che hanno tipi di parametri molto diversi. – hololeap

+1

Continuo a pensare che 'overload' sarebbe il tag più appropriato (e disponibile), soprattutto perché non esiste alcun motivo _tecnico perché il metodo non possa accettare una lista vuota (dal punto di vista della definizione del metodo) - i documenti per esso sembrano molto appropriati : http://www.rubydoc.info/gems/yard/file/docs/Tags.md#overload. Cosa succede se hai cambiato la definizione del metodo in qualcosa come 'my_push (first_object, * more_objects)' e poi li combini e li appiattisci. Non bello, lo ammetto, ma ottiene l'ambito esecutivo ... – davemyron

+0

Il problema che vedo con '@param [Array]' è che lo splat racchiude un argomento Array non splattato in una matrice: 'def push3 (* args) ; args.inspect end; push3 ([]) # => [[]] ' *** Modifica **: Non riesco completamente a convincere SO a formattare un blocco di commenti su più righe * – carp