scala - Scala 中的“let...in”表达式

标签 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 中有什么东西可以用来实现这一点吗?

最佳答案

编辑:

你每天都在学习新东西,这就是 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 会很尴尬)。

您可以嵌套 valdefdef .没有特殊的语法;你不需要 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/

相关文章:

string - 使用 map 和 toInt 将字符串转换为 Scala 中的数字集合

Scala迭代写入文件

scala - Apache Spark - 两个样本 Kolmogorov-Smirnov 测试

scala - 在 Scala 中处理无效参数的最佳方法是什么

Scala,扩展具有通用特征的对象

允许对成员进行数字操作的 scala 类型签名

Scalaz 自动类型类解析

scala - Akka 测试 - 发件人是死信

scala - 如何使用 Google Guice 的 @Inject 和 Scala/(Play 2.4.x)

scala - 没有返回或分配的值会发生什么?