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 -> void to 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) -> void |
Yes |
I propose simplifying the RBS syntax for initialize methods by removing the required
-> voidreturn type annotation.Current Syntax:
Proposed Syntax:
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:
def __init__(self, a: str):constructor(a: string) { }public MyClass(String a) { }public MyClass(string a) { }#: (a: String) -> void