Par exemple, si j'ai Comment puis-je autoriser uniquement mais y a-t-il un meilleur moyen de faire cela? P> p> arg code> être un tableau? Je pourrais faire p>
6 Réponses :
Bien considéré que Ruby est dactylographié de manière dynamique que vous ne pouvez pas appliquer que de manière similaire, comme dans C. Au lieu de comparer une chaîne, vous pouvez le comparer à la classe.
Pour améliorer votre exemple, j'aurais écrit: p> arg.is_a? (Tableau) code> p>
Vous ne pouvez pas faire fonction DEF (Array arg) code> Comme dans d'autres langues, mais vous pouvez remplacer quatre lignes de votre deuxième extrait de votre deuxième extrait par un seul:
def function(arg)
raise TypeError unless arg.is_a? Array
# code...
end
Ruby ne prend pas en charge la vérification du type - au moins, pas dans le sens de la possibilité de déclarer des types d'arguments dans le cadre de la signature de la méthode. En règle générale, l'appelant est responsable du passage des objets corrects, ou les objets transmises sont responsables de la conversion. Cependant, vous pouvez certainement faire vos propres coercitions. En fait, About.com a un exemple d'utiliser la déclaration de cas pour faire juste ce type de vérification de type.
Voici quelques exemples supplémentaires: P>
# Ask your object to convert itself to an array. def foo my_object my_object.to_a end # Give your object a #to_a method if it doesn't already have one. def foo my_object unless my_object.respond_to? :to_a def my_object.to_a # perform your type conversion end end end # Do your own type conversions. def foo my_object case my_object when Array p my_object when String my_object.scan /\d+/ end end
Vous pouvez gêner votre cœur dans Ruby, mais cela va à l'encontre du flux de la langue.
D'autres ont souligné comment vous pouvez techniquement appliquer un type d'argument, mais vous combattez une bataille fondamentale avec la façon de penser de rubis. Google autour de "dactylographie de canard".
Dans le monde de rubis, nous ne nous inquiétons généralement pas du type d'argument, mais plutôt de savoir si cela répond à l'interface de ce que nous voulons faire avec elle. En d'autres termes, cela compare-t-il comme un canard? Assez bon! P>
Permet de supposer que vous essayez d'utiliser un tableau pour quelque chose: p> si vous appelez cela comme: Utilisez votre idée de le forcer à être un tableau. P> Fonction (1) code>, vous obtenez
nométhoderror: méthode non définie 'chacun' code> p>
function([1,2,3,4])
function("foo")
function("foo".chars)
Au lieu de soulever une erreur, vous pouvez vous assurer que vous convertissez l'argument en une matrice, mais vous devez plutôt travailler à la routine fournissant le paramètre afin qu'il vous donne une matrice en premier lieu.
def function(*arg) a = arg.flatten p a end function("ab") function(1,2) function([1,2]) #=> #["ab"] #[1, 2] #[1, 2]
Si le récepteur dans votre exemple est trivial et que cela est défini comme une fonction plutôt qu'une méthode, vous voudrez peut-être tourner l'argument dans un récepteur.
class Array def function # do stuff end end
au lieu de
renvoyer "erreur" code>, vous voulez probablement faire
lever ArgumentError code>, mais à part cela, je ne pense pas que ça va devenir beaucoup mieux