Ruby on rails 使用具有流敏感性的联合类型
我尝试使用带有Ruby on rails 使用具有流敏感性的联合类型,ruby-on-rails,ruby,sorbet,Ruby On Rails,Ruby,Sorbet,我尝试使用带有is_a?的联合类型进行流量控制,但仍然会出现sorbet错误。我也尝试过铸造,但仍然遇到同样的错误,那就是: T.any(T::Array[T.untyped],T::hash[Symbol,T.untyped])的T::Array[T.untyped]组件上不存在散列的方法https://srb.help/7003 我有以下结构: class PostProcessingMethod < T::Struct prop :method_name, Symbol
is_a?
的联合类型进行流量控制,但仍然会出现sorbet错误。我也尝试过铸造,但仍然遇到同样的错误,那就是:
T.any(T::Array[T.untyped],T::hash[Symbol,T.untyped])的T::Array[T.untyped]组件上不存在散列的方法https://srb.help/7003
我有以下结构:
class PostProcessingMethod < T::Struct
prop :method_name, Symbol
prop :args, T.any(Array, T::Hash[Symbol, T.untyped]), default: []
prop :changed_fields, T::Array[String], default: []
prop :all, T::Boolean, default: false
prop :force, T::Boolean, default: false
end
我尝试合并T.cast
,以确保sorbet知道它是elsif中的散列,但这似乎没有什么不同
我的期望是,
是一个?
应该允许sorbet知道后处理方法
是elseif
中的一个散列。但是如果不是这样的话,T.cast
当然应该处理这个问题。在发布的代码中,每个.args
调用都被视为一个新变量。如果在局部变量中捕获返回值,则流敏感度将起作用
请参见上的示例
sig { params(post_processing_methods: T::Array[Documents::PostProcessingMethod]).void }
def call(post_processing_methods)
post_processing_methods.each do |post_processing_method|
next unless should_call_method?(post_processing_method)
if @object.respond_to?(post_processing_method.method_name)
if post_processing_method.args.is_a?(Array)
@object.send(post_processing_method.method_name, *post_processing_method.args)
elsif post_processing_method.args.is_a?(Hash)
@object.send(post_processing_method.method_name, **post_processing_method.args)
end
end
end
end