禁止在Scala中使用命名参数

时间:2013-09-29 13:39:08

标签: scala

在Scala中是否有办法禁止使用函数的命名参数?

示例:

def func(num: Int, power: Int) = math.pow(num, power)

func(3, 2)                   // OK
func(num = 3, power = 2)     // Forbidden

2 个答案:

答案 0 :(得分:7)

您可以使用函数文字:

val func = (num: Int, power: Int) => math.pow(num, power)

func(3, 2)
func(num = 3, power = 2)  // "error: not found: value num"

(虽然Function2的{​​{1}}仍有参数名称:)

apply

答案 1 :(得分:1)

以下是我的建议:

apm@mara:~$ scalac -deprecation -Xfatal-warnings
Welcome to Scala version 2.11.0-20130923-052707-7d570b54c3 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def f(@deprecatedName('x) x: Int) = 2 * x
f: (x: Int)Int

scala> f(3)
res0: Int = 6

scala> f(x = 4)
<console>:9: warning: naming parameter x has been deprecated.
              f(x = 4)
                  ^
error: No warnings can be incurred under -Xfatal-warnings.

不幸的是,它今天不会那样,虽然它是easy tweak

您今天看到的错误是:

error: deprecated parameter name x has to be distinct from any other parameter name (deprecated or not).

弃用参数的当前名称是否有意义?

JavaDoc说:

  

注释@Deprecated的程序元素是程序员所在的程序元素   不鼓励使用,通常是因为它是危险的,或者是因为   存在更好的替代方案。

如果您可以在调用函数时激励阻止用户使用命名参数,那么您应该能够直接弃用该用法。

对于新错误,可能有更好的措辞:

warning: that parameter is he-who-must-not-be-named!