Statisch typisierter Ruby mit Sorbet

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. スクリーンショット 2020-06-17 12.19.15.png

Recommended Posts

Statisch typisierter Ruby mit Sorbet
Versuchen Sie es mit Cocoa von Ruby
Erstellen eines Kalenders mit Ruby
Erstellen Sie eine Lotterie mit Ruby
[Vollständige Programmierung] §2 Versuchen Sie es mit Ruby
Schreiben Sie Ruby-Methoden mit C (Teil 1)
Installieren Sie Ruby 2.5 unter CentOS 7 mit SCL
[Vollständige Programmierung] §3 Berechnen wir mit Ruby!