';让…进来';Scala中的表达式
在OCaml中,';让…进来';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
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
}