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
在上面運行prototype會自動生成
$ 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
提供了三種選擇。
rb
僅從可用的 Ruby 程式碼生成rbi
從冰糕 RBI 生成runtime
從運行時 API 生成有兩個重要的概念,環境和定義。
環境是一個追蹤所有聲明的字典。與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。