【问题标题】:Is everything a function or expression or object in scala?scala中的一切都是函数、表达式或对象吗?
【发布时间】:2012-04-05 23:51:01
【问题描述】:

我很困惑。

我认为一切都是表达式,因为语句返回一个值。但我也听说在scala中一切都是对象。

现实中是什么?为什么 scala 选择以一种方式或另一种方式来做呢?这对 Scala 开发人员意味着什么?

【问题讨论】:

    标签: scala


    【解决方案1】:

    我认为一切都是表达式,因为语句返回一个值。

    有些东西没有价值,但在大多数情况下,这是正确的。这意味着我们基本上可以放弃Scala中“语句”和“表达式”之间的区别。

    然而,术语“返回值”不太合适。我们说一切都“评估”为一个值。

    但我也听说在 scala 中一切都是对象。

    这与前面的陈述完全不矛盾:) 它只是意味着每个可能的 value 都是一个对象(因此每个表达式都计算为一个对象)。顺便说一句,函数作为 Scala 中的一等公民,也是对象。

    为什么 scala 选择这样做?

    需要注意的是,这实际上是 Java 方式的一种概括,其中语句和表达式是不同的事物,并非所有事物都是对象。您可以将每段 Java 代码翻译成 Scala 而无需进行大量调整,但反之则不然。所以这个设计决策使得 Scala 在简洁性和表达性方面实际上更强大

    这对 Scala 开发人员意味着什么?

    例如,这意味着:

    • 您通常不需要return,因为您可以将返回值作为方法中的最后一个表达式
    • 您可以利用 ifcase 是表达式这一事实来缩短您的代码

    一个例子是:

    def mymethod(x: Int) = if (x > 2) "yay!" else "too low!"
    
    // ...
    println(mymethod(10))  // => prints "yay!"
    println(mymethod(0))   // => prints "too low!"
    

    我们也可以将这样一个复合表达式的值赋给一个变量:

    val str = value match {
                case Some(x) => "Result: " + x
                case None    => "Error!"
              }
    

    【讨论】:

    • mymethod 甚至不需要大括号,它可以是没有大括号的单线。 def mymethod(x: Int) = if (x > 2) "yay!" else "too low!"
    • @Dan:是的,这是一个更好的例子来证明这一点(尽管恕我直言,它的可读性有点差)
    【解决方案2】:

    这里的区别在于断言“一切都是表达式”是针对代码块做出的,而“一切都是对象”是关于代码块的。程序中的值。


    代码块

    在Java 语言中,有表达式语句。也就是说,任何代码“块”都是要么表达式语句;

    //the if-else-block is a statement whilst (x == 4) is an expression
    if (x == 4) {
        foo();
    }
    else {
        bar();
    }
    

    表达式有一个类型;声明没有;调用语句纯粹是因为它们的副作用

    在scala中,每个代码块都是一个表达式;也就是说,它有一个类型:

    if (x == 4) foo else bar //has the type lub of foo and bar
    

    这非常重要!这一点我怎么强调都不为过;这是让 scala 工作起来很愉快的原因之一,因为我可以为表达式赋值。

    val x = if (x == 4) foo else bar
    

    价值观

    我的意思是我们可能在程序中引用的东西:

    int i = foo(); //i is a reference to a value
    java.util.TimeUnit.SECONDS;
    

    在Java 中,上面的i 不是一个对象——它是一个原语。此外,我可以访问TimeUnit 的字段SECONDS,但TimeUnit 也不是对象;它是一个 static (因为需要更好的短语)。在斯卡拉:

    val j = 4
    Map.empty
    

    语言而言,j 是一个对象(我可能会向它分派方法),Map 也是一个对象——该类型的模块(或伴生对象) scala.collection.immutable.Map.

    【讨论】:

    • @pjp "lowest upper bound" - foo 和 bar 类型最接近的公共父类型。
    【解决方案3】:

    scala 中的一切都是函数、表达式还是对象?

    没有。

    有些东西不是对象。例如类,方法。

    有些东西不是表达式。例如class Foo { } 是一个语句,不计算任何值。 (这点和上面基本一样。)

    有些东西不是函数。我不需要提及任何示例,因为在任何 Scala 代码中都会看到很多。

    换句话说,“一切都是 X”只不过是一种推销(在 Scala 的情况下)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-02
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2014-06-07
      相关资源
      最近更新 更多