gpt4 book ai didi

Scala 表达式求值

转载 作者:行者123 更新时间:2023-12-05 02:23:18 26 4
gpt4 key购买 nike

我对以下 Scala 编译器行为很感兴趣。当我声明一个类型为 unit 的函数,但仍然提供一个计算结果为 Int 的函数作为主体时,Scala 编译器可以接受。

def add(x:Int, y:Int) = x + y
def main(args: Array[String]): Unit = {add(args(0).toInt, args(0).toInt)}

虽然其他类型的情况并非如此

def afunc: String = {1} //type mismatch;  found   : Int(1)  required: String

如果我写的话

def afunc: Unit = {1}

def main(args: Array[String]): Unit = {2 + 2} // Which is just like the first addition above

在这两种情况下,我都会收到以下警告:

a pure expression does nothing in statement position; you may be omitting necessary parentheses 

从某种意义上说,这里有 2 个问题。返回评估为 Int 的函数和表达式 2 + 2 之间的区别是什么。那么到底为什么编译器不会提示假设评估为 Unit 的函数获得评估为另一种类型的主体,因为它会发生在其他类型之间。

非常感谢,

马塔里

最佳答案

What is the difference between a function that return evaluate to an Int and the expression 2 + 2.

评估为 Int 的函数可能有副作用

var a = 0
def fn: Int = {
a = a + 1
1
}

每次调用 fn 都会改变 a 的值。

Then why on earth, the compiler does not complain that a function that is suppose to evaluate to Unit, gets a body that evaluate to another type, as it would happens between other types.

当您将 Unit 指定为返回类型时,编译器会从函数返回的任何值隐式转换为 Unit(只有一个 Unit 值,因为它是一个对象,您可以将其视为 Scala 的 void 类型) .

关于Scala 表达式求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23206201/

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