使用对流量敏感的并集类型

时间:2019-07-15 02:44:56

标签: ruby-on-rails ruby sorbet

我正在尝试将联合类型与is_a?一起使用以进行流量控制,但仍然出现冰糕错误。我也尝试过强制转换,但仍然遇到相同的错误,即:

Method to_hash does not exist on T::Array[T.untyped] component of T.any(T::Array[T.untyped], T::Hash[Symbol, 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

并且我正在(目前)这样的方法中使用它:

    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

我尝试合并T.cast以确保冰糕知道elsif中的哈希值,但这似乎没有什么改变。

我的期望是is_a?应该让冰糕知道post_processing_methodHash中的elseif。但是,如果不是这种情况,T.cast应该可以解决这个问题。

1 个答案:

答案 0 :(得分:1)

在发布的代码中,每个.args调用都被视为一个新变量。如果将返回值捕获到局部变量中,那么流量灵敏度将起作用。

sorbet.run上查看示例