Dialyxir错误order_by不返回Ecto.Query.t

时间:2018-03-22 16:55:42

标签: elixir ecto dialyzer typespec

我有这个方法

@spec modify_query(Ecto.Query.t) :: Ecto.Query.t
def modify_query(query) do
  # modifies a Ecto.Query.t
end

然后我用查询链接该方法:

Item
|> where([active: true])
|> order_by([desc: :start])
|> modify_query

代码正常运行但显然dialyzer order_by没有返回Ecto.Query.t,因为它抱怨:

  

调用' modify_query' ...没有类型为atom()|的术语   ' Elixir.Ecto.Query':t()(带有不透明的子字符)作为第一个参数

如果我发表评论# |> order_by([desc: :start]),则dialyzer不会抱怨

我通过iex测试了输出:

Item
|> where([active: true])
|> order_by([desc: :start])

它说它的数据类型是Ecto.Query:

Term                                                                         
  #Ecto.Query<from r in Item, where: r.active == true, order_by: [desc: r.start]>
Data type                                                                    
  Ecto.Query

那么透析器怎么会抱怨?

1 个答案:

答案 0 :(得分:1)

此处有更多信息https://elixirforum.com/t/dialyxir-error-when-using-ecto-query-t-as-function-argument/7491

基本上,order_by是一个宏,dialyxir抱怨opaque类型。

我认为它已在最近版本的Ecto中修复,但如果您在旧版本的Ecto中遇到此问题,则可以通过交换调用来解决此问题:

function getTitles() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Test2");
  var urls = sheet.getRange("G3:G").getValues();
  var titleList = [], newValues = [],
      response, doc, title;

  for (var row = 0, var len = urls.length; row < len; row++) {
    if (urls[row] != '') {
      response = UrlFetchApp.fetch(urls[row]);
      doc = Xml.parse(response.getContentText(),true);
      title = doc.html.head.title.getText();
      newValues.push([title]);  
      titleList.push(title);  
      Logger.log(title);
    } else newValues.push([]);
  }

  Logger.log('newValues ' + newValues);
  Logger.log('titleList ' + titleList);

  // SET NEW COLUMN VALUES ALL AT ONCE!
  sheet.getRange("H3").offset(0, 0, newValues.length).setValues(newValues);
  return titleList; 
}