'让...在Scala中表达'

时间:2013-12-13 14:27:08

标签: 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 of this expression *)

这就是我希望等效的Scala看起来像:

def squareTheSum(a: Int, b: Int): Int =
    let sum: Int = a + b in
        sum * sum

我可以使用Scala中的任何内容来实现此目的吗?

1 个答案:

答案 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中嵌套defdef。没有特殊的语法;你不需要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。我认为与多语句形式相比,结果结构非常钝。