在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中的任何内容来实现此目的吗?
答案 0 :(得分:10)
编辑:
你每天都在学习新知识,这已经是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 }
但是我会说这不是那么容易阅读,并且不那么灵活(嵌套让它变得很尴尬)。
您可以在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”之间没有显着差异(或者您可以将表达式移动到下一行,并且如果它使得更像OCaml,则假设“in”是隐含的:D)。
val squareSum = {
val sum = a + b // in
sum * sum
}
另一个更具技术性的人:Clojure's 'let' equivalent in Scala。我认为与多语句形式相比,结果结构非常钝。