2013-07-16 2 views
8

PHP Exemple:Est-ce que Ruby prend en charge l'indication de type?

function do_something(int $i) { 
    return $i + 2; 
} 

Ruby Exemple:

class MyClass 
    # ... 
end 

def do_something(MyClass x) 
    x.prop1 = "String..." 
end 

Y at-il quelque chose de semblable à cela? Merci.

+2

Notez que php prend en charge le typehinting pour les tableaux et les objets uniquement. '(int $ i)' n'est malheureusement pas possible. Pourquoi les downvotes ici? Pour moi, en PHP-dev, c'est intéressant – hek2mgl

+0

Désolé quoi? PHP ne supporte pas le typage scalaire sans extensions tierces – Hast

+1

@Hast malheureusement pas – hek2mgl

Répondre

3

Ruby n'a pas une telle chose, mais tout ce que vous avez à faire est d'ajouter une seule ligne comme suit:

def do_something(x) 
    raise "Argument error blah blah" unless x.kind_of?(MyClass) 
    ... 
end 

Pas grave. Mais si vous sentez qu'il est trop bavard, puis il suffit de définir une méthode:

module Kernel 
    def verify klass, arg 
    raise "Argument error blah blah" unless arg.kind_of?(klass) 
    end 
end 

et le mettre dans la première ligne:

def do_something(x) 
    verify(MyClass, x) 
    ... 
end 
+1

Pour une documentation telle que yard, rdoc, il existe une syntaxe spéciale pour spécifier la classe des arguments. – sawa

+6

c'est drôle "tout ce que vous avez à faire est d'écrire une exception personnalisée pour chaque paramètre à chaque appel de fonction" J'ai vraiment dû rire :). Je ne savais pas que le rubis était de la pure poubelle jusqu'à ce que je découvre qu'il n'y a aucun indice. Maintenant, je ne vais pas m'embêter avec cette langue pour sûr – Toskan

+4

Mis à part les soucis esthétiques, ce n'est pas sémantiquement équivalent à l'indication de type. Fondamentalement, il s'agit du contrôle _runtime_, comparé à hinting de type, qui permet de vérifier _static_. C'est à dire. Je peux vérifier tous les chemins de code immédiatement, sans avoir à les exécuter. Je n'essaie pas de jeter Ruby, juste en soulignant que les contrôles de type runtime ne sont pas équivalents. Ceci n'est équivalent qu'avec une couverture de test complète (au-delà de la "couverture à 100%": il faut tester chaque chemin de code, ce qui est plus que juste frapper chaque ligne syntaxique). c'est ... un gros problème: P – hraban

3

Si vous voulez vraiment vous assurer une certaine action est effectuée sur une instance d'une classe spécifique (comme un entier), puis envisager de définir cette action sur la classe spécifique:

class Integer 
    def two_more 
    self + 2 
    end 
end 

3.two_more #=> 5 
2.0.two_more #=> undefined method `two_more' for 2.0:Float (NoMethodError) 

class MyClass 
    def do_something 
    self.prop1 = "String..." 
    end 
end 
+2

Qui ne fonctionne que pour * un * "paramètre" (le récepteur), en raison d'un seul envoi. – user2246674

1

Non, Ruby lui-même ne supporte pas, et je pense ce n'est pas l'intention de Matz de l'ajouter à la langue ... Ruby embrasse vraiment duck typing dans sa propre API interne et fait de Ruby un langage très dynamique et productif ...

+9

Tout va bien jusqu'à ce que vous arriviez à des systèmes complexes et que ces arguments doivent correspondre à une certaine implémentation. Ruby, une langue comme elle est - pourrait vraiment faire avec une telle fonctionnalité. C'est une excellente fonctionnalité de certaines des meilleures langues OO :) – Oddman

2

Bouchon éhonté - Je viens de publier un Ruby gem pour cela - http://rubygems.org/gems/type_hinting

L'utilisation est ici - https://github.com/beezee/ruby_type_hinting

Je suis allé le chercher d'abord et trouvé ce fil. Je n'ai pas trouvé ce que je cherchais, alors je l'ai écrit et je me suis dit que je partagerais ici.

Je pense que c'est plus concis que l'une des solutions proposées ici et vous permet également de spécifier le type de retour pour une méthode.

Questions connexes