Quand je suis arrivé au typage statique tel que Scala et Dart et que j'ai touché Ruby pour la première fois depuis un moment, le typage dynamique est difficile. Il semble que le typage statique sera officiellement introduit à partir de Ruby3, mais d'ici là, il vaut mieux le surpasser avec Sorbet.
Sorbet Une gemme qui effectue une vérification de type statique qui peut également être utilisée dans la série Ruby2. Sa force est de pouvoir être progressivement introduit dans les projets existants.
Install
Gemfile
gem 'sorbet', :group => :development
gem 'sorbet-runtime'
bundle install
srb init
srb tc
Si vous l'initialisez avec srb dedans
, vous pouvez utiliser les fonctions liées à srb.
srb tc
vérifiera le type de ceux avec srb activé, ce qui sera décrit plus tard, et donnera une erreur.
Use
# typed: true
require 'sorbet-runtime'
module A extend T::Sig
sig {params(left: Float, right: Float).returns(Float)}
def div(left, right)
return left / right;
end
module_function :div
end
puts A.div(1.0, 2.0)
Tout d'abord, ceux qui réussissent le contrôle de type.
La première ligne est le contrôle valide / invalide du contrôle de type, qui doit être spécifié explicitement. Si vous voulez aller explicitement là-bas, vous pouvez spécifier false.
Le T :: Sig
sur la 4ème ligne est inclus dans le sorbet-runtime
, mais en l'étendant, vous pouvez utiliser le sig
qui décrit le IF du paramètre de fonction.
La méthode officielle de haut niveau de ʻextends T :: Sig` fonctionne également comme syntaxe, mais elle ne fonctionne pas avec Bug. Alors laissez le module ou la classe s'étendre.
Au fait, si vous ne décrivez pas le IF de la méthode, il vous suffit de le décrire sur la première ligne.
Par exemple, si le div ci-dessus renvoie un type String, une erreur comme celle-ci apparaîtra.
lib/main.rb:7: Returning value that does not conform to method result type https://srb.help/7005
7 | return "";
^^^^^^^^^
Expected Float
lib/main.rb:6: Method div has return type Float
6 | def div(left, right)
^^^^^^^^^^^^^^^^^^^^
Got String("") originating from:
lib/main.rb:7:
7 | return "";
Cependant, si c'est quelque chose comme Integer pour Float, il y a des choses que vous ne savez pas avant l'exécution.
$ srb tc
No errors! Great job.
$ ruby lib/main.rb
Traceback (most recent call last):
...
Expected type Float, got type Integer with value 1 (TypeError)
Caller: lib/main.rb:12
Definition: lib/main.rb:6
IDE Support Pour vscode, entrez simplement sorbet-lsp. La plupart des plugins vscode eux-mêmes sont encore en cours de développement et instables, mais ils sont suffisamment utiles.
Recommended Posts