RBS adalah bahasa untuk menggambarkan struktur program Ruby. Anda dapat menuliskan definisi kelas atau modul: metode yang didefinisikan dalam kelas, variabel instan dan tipenya, dan hubungan pewarisan/campuran. Ini juga memungkinkan mendeklarasikan konstanta dan variabel global.
Berikut ini adalah contoh kecil RBS untuk aplikasi chatting.
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
pada tahun 2023.)>= 3.0
pada tahun 2023.) Instal permata rbs
. $ gem install rbs
dari baris perintah, atau tambahkan baris di Gemfile
Anda.
gem "rbs"
Permata dikirimkan bersama alat baris perintah rbs
untuk menunjukkan kemampuannya dan membantu mengembangkan RBS.
$ rbs version
$ rbs list
$ rbs ancestors ::Object
$ rbs methods ::Object
$ rbs method Object then
Pengguna akhir rbs
mungkin akan menganggap rbs prototype
paling berguna. Perintah ini menghasilkan deklarasi tanda tangan boilerplate untuk file Ruby. Misalnya, Anda telah menulis skrip Ruby di bawah ini.
# 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
Menjalankan prototype di atas akan otomatis menghasilkan
$ 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
Ini mencetak tanda tangan untuk semua metode, kelas, variabel instan, dan konstanta. Ini hanyalah titik awal, dan Anda harus mengedit hasilnya agar lebih akurat dengan tanda tangan Anda.
rbs prototype
menawarkan tiga opsi.
rb
dihasilkan hanya dari kode Ruby yang tersediarbi
dihasilkan dari Sorbet RBIruntime
dihasilkan dari API runtime Ada dua konsep penting, lingkungan dan definisi .
Lingkungan adalah kamus yang melacak semua deklarasi. Apa deklarasi yang terkait dengan kelas String
? Lingkungan akan memberi Anda jawabannya.
Definisi memberi Anda detail kelas. Apa tipe nilai kembalian metode gsub
dari kelas String
? Definisi kelas String
mengetahui daftar metode yang disediakan dan tipenya.
Berikut ini adalah kode kecil untuk mengambil definisi metode 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
dan Struct
Berikut adalah daftar beberapa tempat Anda dapat berbicara dengan pengelola aktif.
rbs
di server Ruby Discord.types
di ruang kerja ruby-jp slack. Setelah memeriksa repo, jalankan bin/setup
untuk menginstal dependensi. Kemudian, jalankan bundle exec rake test
untuk menjalankan pengujian. Anda juga dapat menjalankan bin/console
untuk perintah interaktif yang memungkinkan Anda bereksperimen.
Untuk memasang permata ini ke mesin lokal Anda, jalankan bundle exec rake install
. Untuk merilis versi baru, perbarui nomor versi di version.rb
, lalu jalankan bundle exec rake release
, yang akan membuat tag git untuk versi tersebut, dorong git commit dan tag, dan dorong file .gem
ke rubygems.org.
Laporan bug dan permintaan penarikan diterima di GitHub di https://github.com/ruby/rbs.