使用多个变量将 Sorbet 类型签名添加到 attr_reader/attr_writer
Adding Sorbet type signatures to attr_reader/attr_writer with multiple variables
我有一个 attr_reader
提供了不止一个变量,像这样:
attr_reader :user, :series
我想为其添加类型签名,但 Sorbet 不支持多个 return 类型,
sig { returns(User, Series) }
attr_reader :user, :series
像这样拆分它们是唯一的选择吗?:
sig { returns(User) }
attr_reader :user
sig { returns(Series) }
attr_reader :series
是的,唯一的选择是拆分您的属性声明,就像您为它们定义单独的 getter/setter 方法时所做的那样,除非您的所有属性都属于同一类型。
这是因为 Sorbet 在其操作的 DSL 阶段实际上在 attr_reader
/attr_writer
/attr_accessor
声明中使用 sig
来在这些声明生成的合成方法上定义 sig
。因此,attr_reader
的单个 getter、attr_writer
的单个 setter 和 attr_accessor
的 getter/setter 对是综合生成的,并且 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
我有一个 attr_reader
提供了不止一个变量,像这样:
attr_reader :user, :series
我想为其添加类型签名,但 Sorbet 不支持多个 return 类型,
sig { returns(User, Series) }
attr_reader :user, :series
像这样拆分它们是唯一的选择吗?:
sig { returns(User) }
attr_reader :user
sig { returns(Series) }
attr_reader :series
是的,唯一的选择是拆分您的属性声明,就像您为它们定义单独的 getter/setter 方法时所做的那样,除非您的所有属性都属于同一类型。
这是因为 Sorbet 在其操作的 DSL 阶段实际上在 attr_reader
/attr_writer
/attr_accessor
声明中使用 sig
来在这些声明生成的合成方法上定义 sig
。因此,attr_reader
的单个 getter、attr_writer
的单个 setter 和 attr_accessor
的 getter/setter 对是综合生成的,并且 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