';让…进来';Scala中的表达式

';让…进来';Scala中的表达式,scala,Scala,在OCaml中,let…In表达式允许您在表达式而不是语句中创建命名的局部变量。(是的,我知道从技术上讲,一切都是一个表达式,但是Unit返回值是相当无用的。)下面是OCaml中的一个快速示例: let square_the_sum a b = (* function definition *) let sum = a + b in (* declare a named local called sum *) sum * sum (* return the value o

在OCaml中,
let…In
表达式允许您在表达式而不是语句中创建命名的局部变量。(是的,我知道从技术上讲,一切都是一个表达式,但是
Unit
返回值是相当无用的。)下面是OCaml中的一个快速示例:

let square_the_sum a b = (* function definition *)
    let sum = a + b in (* declare a named local called sum *)
        sum * sum (* return the value of this expression *)
下面是我希望等效Scala的外观:

def squareTheSum(a: Int, b: Int): Int =
    let sum: Int = a + b in
        sum * sum
Scala中有什么东西可以用来实现这一点吗

编辑:

你每天都在学习新的东西,而这一直都是

但我要说的是,它几乎没有那么容易阅读,也没有那么灵活(嵌套let会让人感到尴尬)


您可以将
val
def
嵌套在
def
中。没有特殊的语法;你不需要一个

def squareTheSum(a: Int, b: Int): Int = {
  val sum = a + b
  sum * sum
}
我看这里的可读性没有任何不同。但是,如果只想在表达式中创建变量,仍然可以使用大括号这样做:

val a = 2                                       //> a  : Int = 2
val b = 3                                       //> b  : Int = 3
val squareSum = { val sum = a + b; sum * sum }  //> squareSum  : Int = 25
分号和单词“in”之间没有明显的区别(或者您可以将表达式移到下一行,并假设“in”是隐含的,如果它更像OCaml:D)



另一个更具技术性的例子是:。我认为,与多语句表单相比,生成的结构相当迟钝。

这就是我目前的做法,显然是100%正确的。我只是想知道是否有一种方法可以只使用表达式(我真的很喜欢OCaml中let表达式的可读性)。@GJK如果您将
val
视为
let
关键字,是的,有一种方法(没有什么可以阻止您将函数赋值给val:
val plusOne=(x:Int)=>x+1
)更让我好奇的是,我是否可以只使用表达式编写Scala代码(因此没有返回单位的
val
或“语句”)。我不想这样编程,我只是有点好奇。(好的,你明白了。我被Lisp迷住了。)我明白了。我认为这是一个功能纯度问题,而不是可读性问题,因为很难说“in”形式实际上更可读或更清晰(或者更少;只是不同而已)。但这并不意味着它无效。如果没有实际的语言支持(一个新的关键字),我不相信你能做到这一点。我不相信你能在
postfix操作符中写一个这样工作的
。也就是说……如果我要进一步研究这个问题,我可能会研究宏、宏注释和类注释。您可以做很多事情(特别是在2.11中)以有趣的方式调整Scala。我没有一个完整的答案;但我将从这里开始研究如何制作一个
let…in
结构。
val a = 2                                       //> a  : Int = 2
val b = 3                                       //> b  : Int = 3
val squareSum = { val sum = a + b; sum * sum }  //> squareSum  : Int = 25
val squareSum = {
  val sum = a + b // in
    sum * sum
}