メインコンテンツまでスキップ
Examples Verified (100%)

T-Ruby vs 他のツール

Rubyエコシステムには静的型付けに対するいくつかのアプローチがあります。このページでは、T-Rubyがどこに位置するかを理解するために、他のソリューションと比較します。

クイック比較

機能T-RubyRBSSorbetTypeScript
言語RubyRubyRubyJavaScript
型構文インライン別ファイルコメント + sigインライン
コンパイルあり (.trb → .rb)N/Aなしあり (.ts → .js)
ランタイムチェックなしなしオプションなし
段階的型付けありありありあり
ジェネリック型ありありありあり
学習曲線低い (TypeScript風)中程度高い-

T-Ruby vs RBS

RBSはRuby 3.0で導入されたRubyの公式型シグネチャ形式です。

RBSアプローチ

型は別の.rbsファイルに書かれます:

lib/user.rb
class User
def initialize(name, age)
@name = name
@age = age
end

def greet
"Hello, I'm #{@name}"
end
end
sig/user.rbs
class User
@name: String
@age: Integer

def initialize: (String name, Integer age) -> void
def greet: () -> String
end

T-Rubyアプローチ

型はインラインで書かれます:

lib/user.trb
class User
@name: String
@age: Integer

def initialize(name: String, age: Integer): void
@name = name
@age = age
end

def greet: String
"Hello, I'm #{@name}"
end
end

主な違い

側面T-RubyRBS
型の場所コードと同じファイル別の.rbsファイル
同期自動手動(ドリフトの可能性)
可読性コーディング中に型が見える2つのファイルを確認する必要
生成出力.rb + .rbs.rbsのみ

RBSを選ぶとき:

  • Rubyソースファイルを変更できない場合
  • サードパーティライブラリを扱う場合
  • チームが関心の分離を好む場合

T-Rubyを選ぶとき:

  • 型をコードと一緒に置きたい場合
  • TypeScriptから来た場合
  • 自動RBS生成が欲しい場合

T-Ruby vs Sorbet

SorbetはStripeが開発した型チェッカーです。

Sorbetアプローチ

型はsigブロックとT::構文を使用します:

lib/calculator.rb
# typed: strict
require 'sorbet-runtime'

class Calculator
extend T::Sig

sig { params(a: Integer, b: Integer).returns(Integer) }
def add(a, b)
a + b
end

sig { params(items: T::Array[String]).returns(String) }
def join(items)
items.join(", ")
end
end

T-Rubyアプローチ

lib/calculator.trb
class Calculator
def add(a: Integer, b: Integer): Integer
a + b
end

def join(items: Array<String>): String
items.join(", ")
end
end

主な違い

側面T-RubySorbet
構文スタイルTypeScript風Ruby DSL
ランタイム依存なしsorbet-runtime gem
ランタイムチェックなしオプション
コンパイル必須不要
冗長性低い高い

ランタイムチェック付きSorbetの例:

# Sorbetはランタイムで型をチェックできる
sig { params(name: String).returns(String) }
def greet(name)
"Hello, #{name}"
end

greet(123) # ランタイムチェックが有効ならTypeError発生

T-Rubyアプローチ:

# 型はコンパイル時のみ
def greet(name: String): String
"Hello, #{name}"
end

greet(123) # コンパイルエラー(実行前に検出)

Sorbetを選ぶとき:

  • ランタイム型チェックが必要な場合
  • すでにプロジェクトでSorbetを使用している場合
  • コンパイルステップを避けたい場合

T-Rubyを選ぶとき:

  • よりクリーンで読みやすい構文が欲しい場合
  • ランタイム依存を避けたい場合
  • TypeScriptから来た場合

T-Ruby vs TypeScript

T-RubyはTypeScriptにインスパイアされているので、比較してみましょう:

構文比較

TypeScript
function greet(name: string): string {
return `Hello, ${name}!`;
}

interface User {
name: string;
age: number;
}

function processUser<T extends User>(user: T): string {
return user.name;
}
T-Ruby
def greet(name: String): String
"Hello, #{name}!"
end

interface User
def name: String
def age: Integer
end

def process_user<T: User>(user: T): String
user.name
end

類似点

  • インライン型アノテーション
  • 型消去(ランタイムオーバーヘッドなし)
  • 段階的型付けサポート
  • Union型(String | Integer
  • ジェネリック型(Array<T>
  • インターフェース定義

違い

側面T-RubyTypeScript
ベース言語RubyJavaScript
型名PascalCase (String, Integer)小文字 (string, number)
Null型nilnull, undefined
オプショナルT? または T | nilT | null または T?
メソッド構文Rubyのdef関数式

統合:複数ツールの併用

T-RubyはRBSファイルを生成するため、他のツールと一緒に使用できます:

┌─────────────┐
│ .trb │
│ files │
└──────┬──────┘
│ trc compile

┌─────────────┐ ┌─────────────┐
│ .rb │ │ .rbs │
│ files │ │ files │
└─────────────┘ └──────┬──────┘

┌──────────────┼──────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Steep │ │ Ruby LSP │ │ Sorbet │
│ checker │ │ IDE │ │(optional)│
└──────────┘ └──────────┘ └──────────┘

推奨

もし...検討すべき
新しいRubyプロジェクトを始めるならT-Ruby - クリーンな構文、良いDX
既存のSorbetコードベースがあるならSorbet - 移行コスト回避
ランタイム型チェックが必要ならSorbet - 組み込みサポート
型をコードから分離したいならRBS - 公式フォーマット
TypeScriptから来たならT-Ruby - 馴染みのある構文
大きなチームで働くならT-Ruby または Sorbet - どちらも有効

結論

T-RubyはRuby型に対する現代的なTypeScriptインスパイアのアプローチを提供します:

  • クリーンなインライン構文
  • ゼロランタイムオーバーヘッド
  • エコシステム互換のための自動RBS生成

RBSやSorbetを置き換えることではありません—Ruby開発者に、ワークフローや好みにより適した別のオプションを提供することです。