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。