2

运行某个 Scala 脚本会给出以下警告:

warning: there were 1 deprecation warnings; re-run with -deprecation for details

我怎么做?

是的,我有 RTFM,但它所说的(用 a 分隔编译器参数和其他参数-)不起作用。

4

3 回答 3

3

只有 Scala 解释器(用于执行脚本时)支持 shebang 语法 ('#!')。scalac 和 scala REPL 都不支持它。有关问题跟踪,请参见此处

有关适用于 shebang 的答案,请参见下文。

您可能需要考虑什么而不是使用“#!”

为了能够在 REPL解释器中使用文件(可能作为源代码,例如,如果它是一个有效的类),您应该完全放弃 shebang 标头,并可能添加一个启动器脚本(例如,有一个可执行的 'foo' 启动 'scala foo.scala')。

让我们将 'foo.scala' 定义为以下单行:

case class NoParens // <-- case classes w/o () are deprecated

这将适用于两个解释器:

$ scala foo.scala

...编译器

$ scalac foo.scala

...和REPL:

$ scala -i foo.scala

// or:

$ scala
scala> :load foo.scala

以上所有内容都会给你在你的问题中看到的模糊的弃用警告。
对于通过“scala”可执行文件执行脚本以及通过“scalac”进行编译,您所要做的就是在命令行中添加一个“-deprecation”参数:

$ scala -deprecation foo.scala

// or:

$ scalac -deprecation foo.scala

现在两者都将为您提供详细的弃用警告(“-feature”也是如此)。

REPL 为您提供了 2 个选项:1) 如上所述添加 -deprecation 参数(练习留给读者) 2) 在 REPL 中使用 ':warnings',如下所示:

$ scala -i foo.scala
Loading foo.scala...
warning: there were 1 deprecation warnings; re-run with -deprecation for details
defined class NoParens

Welcome to Scala etc...

scala> :warnings
<console>:7: warning: case classes without a parameter list have been deprecated;
use either case objects or case classes with `()' as parameter list.
case class NoParens // <-- case classes without () are deprecated
                   ^

scala>

不用说,使用 REPL 中的 ':load' 也是如此。

将 '-deprecation' 与 '#!' 一起使用

正如所承诺的,这是使用 shebang 语法的秘诀。我自己通常不使用它,所以欢迎评论:

#!/bin/sh
exec scala $0 $@
!#

case class NoParens // <-- case classes w/o () are deprecated

这将为您提供一个神秘的警告:

$ ./foo.scala
warning: there were 1 deprecation warnings; re-run with -deprecation for details
one warning found

要收到您的警告,只需在“exec scala”之后添加一个“-deprecation”,如下所示:

#!/bin/sh
exec scala -deprecation $0 $@
!#

// etc...

这将产生所需的“警告:不推荐使用没有参数列表的案例类”等......

好吧,这大约涵盖了它。360° 弃用 ;-)

于 2013-04-25T21:27:30.740 回答
2

将脚本变成应用程序:

  1. 删除#! ... !#顶部的任何位(这用于 Unix/Mac 上的可执行脚本)
  2. 把所有东西都包起来object Foo extends App { ... }

然后编译它

scalac -deprecation filename.scala

查看详细的弃用警告。

于 2013-04-24T08:54:42.480 回答
-1

您收到的警告是编译器错误。Scala 有两个可能从脚本调用的编译器:scalac 和 fsc。查找脚本调用其中之一的位置并编辑编译器调用以包含标志 -deprecation。

例如。

scalac -arg1 -arg2 big/long/path/*.scala other/path/*.scala

变成

scalac -deprecation -arg1 -arg2 big/long/path/*.scala other/path/*.scala
于 2013-04-25T01:10:08.113 回答