-
Notifications
You must be signed in to change notification settings - Fork 217
Release Note 3.5
Some of the highlights in RBS 3.5 are:
- Optional record keys (#1717, #1732)
- Untyped function parameters (#1806)
- Add lexer API (#1829, #1831)
You can install it with $ gem install rbs
or using Bundler.
gem 'rbs', '~> 3.5.0'
Read the CHANGELOG for the details.
Warning
- RBS 3.5 has many stdlib signature updates. Updating to 3.5 may cause having different type checking results.
- Using new syntax may cause issues with tools that doesn't support RBS 3.5
The record keys with ?
prefix are optional.
type json = {
?id: Integer,
name: String,
email: String?
}
As you can see in types.rbs
, the Types::Record
type provides three methods.
class RBS::Types::Record
attr_reader all_fields: Hash[Symbol, [t, bool]]
attr_reader fields: Hash[Symbol, t]
attr_reader optional_fields: Hash[Symbol, t]
end
The #fields
only contains required fields, and optional_fields
contains optional fields. It means the existing RBS based tools continue working but ignores optional fields.
Pull Requests: #1806
Method type parameters and block parameters can be untyped with (?)
syntax.
class Foo
def dynamic: (?) -> void
end
There is no type checking on parameters to call/define the method, and developers are responsible to call/define the methods with correct parameters. Note that the method with (?)
accepts any blocks.
One of the motivating examples is the scope
method in ActiveRecord. It defines methods with given name and the implementation of the method is given as a block (or proc). RBS cannot type check them statically, but we couldn't write the type of the methods correctly.
class ActiveRecord::Base
def self.scope: (Symbol) { (?) -> void } -> void
| (Symbol, ^(?) -> void) -> void
end
Using the (?)
parameter, we pass any blocks/procs to the methods while the developers are responsible for keep them consistent with other codebase or the type definition.
Having the new syntax in the RBS file will result in unexpected errors if the RBS based tools don't support the syntax.
Parser.lex
method returns the list of tokens from the input, without constructing syntax tree.
tokens = RBS::Parser.lex(source)
The tokens contains all tokens from the source code, including comments and trivia tokens.
You can use the API to implement linters or something that works on comments.