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 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
세 가지 옵션을 제공합니다.
rb
사용 가능한 Ruby 코드에서 생성됩니다.rbi
Sorbet 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
에서 버전 번호를 업데이트한 다음, 버전에 대한 git 태그를 생성하고 git 커밋 및 태그를 푸시한 다음 .gem
파일을 rubygems.org에 푸시하는 bundle exec rake release
실행하세요.
버그 보고서 및 끌어오기 요청은 GitHub(https://github.com/ruby/rbs)에서 환영합니다.