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
по состоянию на 2023 год.)>= 3.0
по состоянию на 2023 г.) Установите драгоценный камень rbs
. $ gem install rbs
из командной строки или добавьте строку в свой Gemfile
.
gem "rbs"
Гем поставляется с инструментом командной строки 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
предлагает три варианта.
rb
генерируется только из доступного кода Ruby.rbi
генерирует из Sorbet RBIruntime
генерируется из API среды выполнения Есть два важных понятия: окружающая среда и определение .
Среда — это словарь, в котором отслеживаются все объявления. Какое объявление связано с классом String
? Окружающая среда даст вам ответ.
Определение дает вам подробную информацию о классе. Каков тип возвращаемого значения метода gsub
класса String
? Определение класса 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
на сервере Ruby Discord.types
в Slack-рабочем пространстве Ruby-jp. После проверки репозитория запустите bin/setup
, чтобы установить зависимости. Затем запустите bundle exec rake test
чтобы запустить тесты. Вы также можете запустить bin/console
для получения интерактивного приглашения, которое позволит вам поэкспериментировать.
Чтобы установить этот драгоценный камень на свой локальный компьютер, запустите bundle exec rake install
. Чтобы выпустить новую версию, обновите номер версии в version.rb
, а затем запустите bundle exec rake release
, который создаст тег git для этой версии, отправит git коммиты и теги и отправит файл .gem
на сайт Rubygems.org.
Отчеты об ошибках и запросы на включение приветствуются на GitHub по адресу https://github.com/ruby/rbs.