Добавление сигнатур типа Sorbet в attr_reader / attr_writer с несколькими переменными - PullRequest
1 голос
/ 02 июля 2019

У меня есть attr_reader, который предоставляет более одной переменной, например:

attr_reader :user, :series

Я хочу добавить к нему сигнатуру типа, но Sorbet не поддерживает несколько типов возврата,

sig { returns(User, Series) }
attr_reader :user, :series

Является ли единственная возможность разделить их так:

sig { returns(User) }
attr_reader :user
sig { returns(Series) }
attr_reader :series

1 Ответ

1 голос
/ 02 июля 2019

Да, единственный вариант - разделить объявления атрибутов, как если бы вы определяли для них отдельные методы получения / установки, если только все ваши атрибуты не относятся к одному типу.

Причина этого заключается в том, что Sorbet на этапе DSL своей работы фактически использует sig в объявлении attr_reader / attr_writer / attr_accessor, чтобы определить sig в синтетических методах, которые производятся этими декларациями. Таким образом, один геттер для attr_reader, один сеттер для attr_writer и пара геттер / сеттер для attr_accessor генерируются синтетически, и к ним применяются sig s.

В результате этого это будет действительным :

sig { returns(String) }
attr_reader :some_string_attr, :other_string_attr

но это не будет:

sig { returns(String, User) }
attr_reader :some_string_attr, :some_user_attr
...