为什么在本地禁用有关部分应用程序的警告似乎不起作用

时间:2019-02-15 09:00:26

标签: ocaml compiler-warnings

在OCaml 4.08中,默认情况下会发出有关部分应用程序的新警告,如下所示:

let _ = (Format.printf "side-effect!@."; List.iter (fun () -> ()))
2 |   (Format.printf "side-effect!@."; List.iter (fun () -> ()))
                                       ^^^^^^^^^^^^^^^^^^^^^^^^
Warning 5: this function application is partial,
maybe some arguments are missing.

尝试通过在所有地方添加注释来在本地禁用它似乎无效:

let[@warning "-5"] _ [@warning "-5"] =
  (Format.printf "side-effect!@."; List.iter (fun () -> ()))[@@warning "-5"]

唯一可行的方法是将[@@@warning "-5"]技术用作mentioned here。但是,这个问题提到了

  

4.06.0之前的OCaml版本不完全支持使用[@warning“ ...”]和[@@ warning“ ...”]在本地禁用警告

在这种情况下,对于OCaml 4.08,在本地禁用此类警告应采用什么语法?

编辑:如glennsl所建议,将let _ = ...替换为ignore (...)确实提供了另一种选择(在[@@warning "-5"]之后确实添加了ignore (...)工作),但统一性较差,因为尽管可以安全地用[@@@warning "-5"]/[@@@warning "+5"] 1 包围它们,但是不能用这种方式替换顶级声明。仍然不能解释为什么我的第一次尝试不起作用:写错了吗,是故意设计的还是可能是疏忽大意的?

1 此“ hack”还具有可能更改先前状态的缺点;例如,如果先前在全局级别禁用警告5,则会无意中将其重新启用。

1 个答案:

答案 0 :(得分:1)

我要说的是,精美手册(第8.13.1节)中的以下引用表明答案是“(无)设计”:

  

请注意,对于特定警告使用哪个范围并没有明确定义。这取决于实现,并且可以在版本之间进行更改。

现在,如果我们试图解释为什么您使警告静音的尝试不起作用的原因,我们可以检查警告5的含义:

  

其结果具有函数类型且被忽略的表达式。

因此,当我们在特定上下文中具有函数表达式{ "extends": "eslint:recommended", "parser": "babel-eslint", "env": { "browser": true, "node": true, "jquery": true, "jasmine": true }, "plugins": [ "json" ], "rules": { "camelcase": 2 } 时,将发出警告。在element(by.css('.col.col-top.col-67 h2'); 的情况下,上下文只是一个应用程序,即一个包含表达式,我们可以要求忘记警告5的范围应该大致为e表达式本身(及其包含表达式和项目)。

现在,对于ignore来说,事情变得不那么清晰了:ignore被绑定到包罗万象的模式let _ = ...时将被忽略。有人可能会争辩说,将e放在let绑定的末尾应该涵盖整个定义,但是如上所述,编译器完全可以自由地不同意这种解释。

但是,这提供了一个完全不需要禁用警告5的替代解决方案:只需将表达式绑定到变量(以_开头,当然可以避免警告26):

[@@ warning "-5"]

不会触发任何警告:通过绑定到这样的变量,表达式可能仍然会被忽略,但是不能抱怨它被主动忽略了。