je définissais cette méthode:Comment interdire un bloc (exige qu'aucun argument de bloc est donné) à Ruby
# @return [Array<String>] items
def produce_items
["foo", "bar", "baz"]
end
Une utilisation correcte serait, évidemment,
produce_items.each do |i|
puts i
end
Mais je l'ai écrit ce , qui ne fait rien en silence:
produce_items do |i|
puts i
end
Est-il possible de déclarer produce_items
de telle sorte que mon utilisation incorrecte produit une erreur/exception? Si MRI ne peut pas le faire, un interprète alternatif peut-il le faire? Est-ce qu'un outil d'analyse statique comme RuboCop ou ruby-lint peut le faire?
Je soupçonne que ce peut être difficile parce qu'il ya des idiomes communs où les méthodes prennent un bloc en option:
def block_optional_implicitly
if block_given?
puts "Got a block"
yield
else
puts "Did not get a block"
end
end
def block_optional_explicitly(&block)
unless block.nil?
puts "Got a block"
block.call
else
puts "Did not get a block"
end
end
(Ceci est un revers de la question How to require a block in Ruby?)
Vous pouvez toujours 'augmenter YikesBlock si block_given?' – Felixyz
Vous pouvez déclencher une exception de façon sélective lorsque la méthode ne l'attend pas. Mais, vous devez être assez prudent pour ne pas le faire dans les méthodes qui pourraient réellement exiger un bloc (facultatif ou non). – kiddorails