gpt4 book ai didi

scala - 为什么 Scala 在 Predef 中的 require 方法允许字符串作为参数?

转载 作者:行者123 更新时间:2023-12-04 13:04:25 26 4
gpt4 key购买 nike

我可以在 Scala 的 Predef 类中使用 String 作为第二个参数的 require 方法,例如

require ("foo" == "bar", "foobar")

首先认为 require 方法为不同的参数作为第二个参数重载。但事实并非如此。 require 方法(Scala 2.9.1)的签名是:
require(requirement: Boolean, message: ⇒ Any): Unit

为什么可以调用上述方法?

最佳答案

我不完全理解这个问题,但这里有一些解释。 requirePredef 中有一个重载版本:

def require(requirement: Boolean) //...
def require(requirement: Boolean, message: => Any) //...

由于 message: => Any,第二个有点困惑类型。如果它只是简单的,它可能会更容易:
def require(requirement: Boolean, message: Any) //...

第二个参数当然是假设不满足断言时附加到错误消息的消息。你可以想象 message应该是 String输入但带有 Any你可以简单地写:
require(x == 4, x)

这将增加 x 的实际值(类型为 Int )如果不等于 4 则转换为错误消息.这就是为什么 Any被选择 - 允许任意值。

但是 : =>呢?部分?这称为按名称调用,基本上意味着:在访问此参数时对其进行评估。想象一下以下片段:
require(list.isEmpty, list.size)

在这种情况下,您要确定 list为空 - 如果不是,则添加实际 list错误信息的大小。然而,按照正常的调用约定, list.size在调用方法之前必须评估部分 - 这可能是浪费的。按照命名约定调用 list.size仅在第一次使用时进行评估 - 当错误消息是构造函数时(如果需要)。

关于scala - 为什么 Scala 在 Predef 中的 require 方法允许字符串作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10673073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com