RBS は、Ruby プログラムの構造を記述する言語です。クラスまたはモジュールの定義 (クラスで定義されたメソッド、インスタンス変数とその型、継承/混合関係) を書き留めることができます。定数とグローバル変数を宣言することもできます。
以下は、チャット アプリ用の RBS の小さな例です。
module ChatApp
VERSION: String
class User
attr_reader login: String
attr_reader email: String
def initialize : (login: String, email: String) -> void
end
class Bot
attr_reader name: String
attr_reader email: String
attr_reader owner: User
def initialize : (name: String, owner: User) -> void
end
class Message
attr_reader id: String
attr_reader string: String
attr_reader from: User | Bot # `|` means union types: `#from` can be `User` or `Bot`
attr_reader reply_to: Message? # `?` means optional type: `#reply_to` can be `nil`
def initialize : (from: User | Bot, string: String) -> void
def reply : (from: User | Bot, string: String) -> Message
end
class Channel
attr_reader name: String
attr_reader messages: Array[Message]
attr_reader users: Array[User]
attr_reader bots: Array[Bot]
def initialize : (name: String) -> void
def each_member : () { (User | Bot) -> void } -> void # `{` and `}` means block.
| () -> Enumerator[User | Bot, void ] # Method can be overloaded.
end
end
3.2
。)>= 3.0
。) rbs
gemをインストールします。 $ gem install rbs
コマンドラインから実行するか、 Gemfile
に行を追加します。
gem "rbs"
gem にはrbs
コマンド ライン ツールが同梱されており、何ができるかを示し、RBS の開発に役立ちます。
$ rbs version
$ rbs list
$ rbs ancestors ::Object
$ rbs methods ::Object
$ rbs method Object then
rbs
のエンド ユーザーは、おそらくrbs prototype
最も便利であると感じるでしょう。このコマンドは、Ruby ファイルの定型署名宣言を生成します。たとえば、以下の Ruby スクリプトを作成したとします。
# person.rb
class Person
attr_reader :name
attr_reader :contacts
def initialize ( name : )
@name = name
@contacts = [ ]
end
def speak
"I'm #{ @name } and I love Ruby!"
end
end
上記でプロトタイプを実行すると、自動的に生成されます。
$ rbs prototype rb person.rb
class Person
@name: untyped
@contacts: untyped
attr_reader name: untyped
attr_reader contacts: untyped
def initialize: (name: untyped) -> void
def speak: () -> ::String
end
すべてのメソッド、クラス、インスタンス変数、および定数のシグネチャを出力します。これは単なる出発点であり、署名とより正確に一致するように出力を編集する必要があります。
rbs prototype
3 つのオプションがあります。
rb
利用可能な Ruby コードのみから生成しますrbi
ソルベ RBI から生成されますruntime
ランタイム API から生成します環境と定義 という2 つの重要な概念があります。
環境は、すべての宣言を追跡する辞書です。 String
クラスに関連付けられた宣言は何ですか?環境が答えを与えてくれるでしょう。
定義により、クラスの詳細がわかります。 String
クラスのgsub
メソッドの戻り値の型は何ですか? String
クラスの定義は、それが提供するメソッドのリストとその型を認識しています。
以下は、 String#gsub
メソッドの定義を取得するための小さなコードです。
require "rbs"
loader = RBS :: EnvironmentLoader . new ( )
# loader.add(path: Pathname("sig")) # Load .rbs files from `sig` directory
# loader.add(library: "pathname") # Load pathname library
environment = RBS :: Environment . from_loader ( loader ) . resolve_type_names
# ::String
string = RBS :: TypeName . new ( name : :String , namespace : RBS :: Namespace . root )
# Class declaration for ::String
decl = environment . class_decls [ string ]
# Builder provides the translation from `declaration` to `definition`
builder = RBS :: DefinitionBuilder . new ( env : environment )
# Definition of instance of String
instance = builder . build_instance ( string )
# Print the types of `gsub` method:
puts instance . methods [ :gsub ] . method_types . join ( " n " )
# Outputs =>
# (::Regexp | ::string pattern, ::string replacement) -> ::String
# (::Regexp | ::string pattern, ::Hash[::String, ::String] hash) -> ::String
# (::Regexp | ::string pattern) { (::String match) -> ::_ToS } -> ::String
# (::Regexp | ::string pattern) -> ::Enumerator[::String, self]
# Definition of singleton of String
singleton = builder . build_singleton ( string )
# No `gsub` method for String singleton
puts singleton . methods [ :gsub ]
Data
とStruct
の使用以下は、アクティブなメンテナーと会話できる場所のリストです。
rbs
チャンネルがあります。types
チャネルがあります。リポジトリをチェックアウトした後、 bin/setup
実行して依存関係をインストールします。次に、 bundle exec rake test
実行してテストを実行します。 bin/console
実行して対話型プロンプトを表示し、実験することもできます。
この gem をローカル マシンにインストールするには、 bundle exec rake install
実行します。新しいバージョンをリリースするには、 version.rb
のバージョン番号を更新してから、 bundle exec rake release
実行します。これにより、そのバージョンの git タグが作成され、git のコミットとタグがプッシュされ、 .gem
ファイルが Rubygems.org にプッシュされます。
バグレポートとプルリクエストは GitHub (https://github.com/ruby/rbs) で受け付けています。