String end class User attr_reader :name #: UserName? # nilの可能性を排除するメソッドを定義 # #: () -> UserName def name! name || raise end end user = User.new user.name.last_name #=> nilの可能性があるので型エラー if user.name.nil? # ... else user.name.last_name #=> nilの可能性があるので型エラー user.name!.last_name #=> 型チェックが通る end
String end class User extend DefNilBang attr_reader :name #: UserName? # @rbs! # def name!: () -> UserName def_nil_bang :name end module DefNilBang def def_nil_bang(*method_names) method_names.each do |name| define_method(:"#{name}!") do value = public_send(name) raise if value.nil? value end end end end
String end class User extend DefNilBang attr_reader :name #: UserName? def_nil_bang :name end class UserName attr_reader last_name: String attr_reader first_name: String end class User extend DefNilBang attr_reader name: UserName? def name!: () -> UserName end rbs生成