在 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 中有什么东西可以用来实现这一点吗?
最佳答案
编辑:
你每天都在学习新东西,这就是 answered before .
object ForwardPipeContainer {
implicit class ForwardPipe[A](val value: A) extends AnyVal {
def |>[B](f: A => B): B = f(value)
}
}
import ForwardPipeContainer._
def squareTheSum(a: Int, b: Int): Int = { a + b } |> { sum => sum * sum }
但我想说这并不容易阅读,也不那么灵活(嵌套 let 会很尴尬)。
您可以嵌套
val
和 def
在 def
.没有特殊的语法;你不需要 let
.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)。
val squareSum = {
val sum = a + b // in
sum * sum
}
另一个更具技术性的内容:Clojure's 'let' equivalent in Scala .我认为与多语句形式相比,生成的结构相当迟钝。
关于scala - Scala 中的“let...in”表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20568872/