[Proposal] Make`-> void` return type annotation on `initialize` methods to be implicit
I propose simplifying the RBS syntax for initialize methods by removing the required -> void return type annotation.
Current Syntax:
#: (a: String) -> void
def initialize(a:)
@a = a
end
Proposed Syntax:
#: (a: String?)
def initialize(a:)
@a = a
end
Why?
-
Redundant - I was moving from Sorbet sigs to RBS style sigs and noticed that I was adding the
-> voidto every initialize method. Even though it makes sense from a completeness perspective, it seemed redundant to me and does not add any new information. -
Initialize is special - The initialize method is already special in Ruby - it's the only method that is called indirectly through
new, cannot meaningfully return a value to its caller, has a fixed, unchangeable return behavior. Making its type signature special in RBS would accurately reflect its special status in the language. -
Comparison with other languages:
Language Example Requires Return Type? Python (with types) def __init__(self, a: str):Optional TypeScript constructor(a: string) { }No Java public MyClass(String a) { }No C# public MyClass(string a) { }No Go N/A - uses factory functions instead N/A Ruby (current RBS) #: (a: String) -> voidYes
👌 won’t hurt since RBS isn’t currently taking advantage of these round parentheses for a dedicated structure.
Edit: such as https://github.com/ruby/rbs/discussions/1639#discussioncomment-10153229? 🤔 Nah, they are compatible.