Wenn ich zum statischen Tippen wie Scala und Dart kam und Ruby zum ersten Mal seit einiger Zeit wieder berührte, ist das dynamische Tippen schwierig. Es scheint, dass die statische Typisierung offiziell von Ruby3 eingeführt wird, aber bis dahin ist es besser, sie mit Sorbet zu übertreffen.
Sorbet Ein Juwel, das statische Typprüfungen durchführt und auch in Ruby2-Serien verwendet werden kann. Seine Stärke ist, dass es schrittweise in bestehende Projekte eingeführt werden kann.
Install
Gemfile
gem 'sorbet', :group => :development
gem 'sorbet-runtime'
bundle install
srb init
srb tc
Wenn Sie es mit "srb in it" initialisieren, können Sie srb-bezogene Funktionen verwenden.
srb tc
überprüft diejenigen mit aktiviertem srb, die später beschrieben werden, und gibt einen Fehler aus.
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)
Zuallererst diejenigen, die die Typprüfung bestehen.
Die erste Zeile ist die gültige / ungültige Kontrolle der Typprüfung, die explizit angegeben werden muss. Wenn Sie explizit dorthin gehen möchten, können Sie false angeben.
Das T :: Sig
in der 4. Zeile ist in der Sorbet-Laufzeit
enthalten, aber wenn Sie dies erweitern, können Sie das sig
verwenden, das die IF des Funktionsparameters beschreibt.
Die offizielle Top-Level-Methode von "erweitert T :: Sig" funktioniert ebenfalls als Syntax, funktioniert jedoch nicht mit Bug. Lassen Sie also das Modul oder die Klasse erweitern.
Wenn Sie die IF der Methode nicht beschreiben, müssen Sie sie übrigens nur in der ersten Zeile beschreiben.
Wenn das obige div beispielsweise einen String-Typ zurückgibt, wird ein Fehler wie dieser angezeigt.
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 "";
Wenn es sich jedoch um eine Ganzzahl für Float handelt, gibt es Dinge, die Sie erst zur Laufzeit kennen.
$ 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 Geben Sie für vscode einfach [sorbet-lsp] ein (https://marketplace.visualstudio.com/items?itemName=danhuynhdev.sorbet-lsp). Die meisten vscode-Plugins selbst befinden sich noch in der Entwicklung und sind instabil, aber sie sind nützlich genug.
Recommended Posts