我应该如何以及何时使用变量/方法声明?

时间:2020-07-23 02:31:05

标签: scala syntax

我正在学习scala,我不知道如何以及何时在scala中使用变量/方法声明。

以下是有关声明和定义的scala语法:https://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html

它表明:

Dcl         ::=  ‘val’ ValDcl
              |  ‘var’ VarDcl
              |  ‘def’ FunDcl
              |  ‘type’ {nl} TypeDcl
PatVarDef   ::=  ‘val’ PatDef
              |  ‘var’ VarDef
Def         ::=  PatVarDef
              |  ‘def’ FunDef
              |  ‘type’ {nl} TypeDef
              |  TmplDef

例如,这是变量x和方法hello的声明:

var x: Int;

class Tester {
  def hello(var x:Int):Int
}

这是变量x和方法hello的定义:

var x: Int = 1
class Tester {
  def hello(var x:Int): Int = x
}

如果我想用scala编写一些应用程序,似乎我只需要定义,我不知道如何以及何时使用声明

声明是否等于接口? 请教育我。

2 个答案:

答案 0 :(得分:2)

在Scala中,(根据我的经验)声明用于两种主要用法:

    接口中的方法和变量类型定义(无论是特征还是抽象类)
  • 键入“ aliasing”以使代码清晰。这可以采用以下形式:别名为单一类型(type UserId = Int)或别名蛋糕类型(type Codec = Serializer with Deserializer

您可能已经注意到,在非抽象类中不能有变量或方法声明,因为在运行时不能有未定义的行为。根据定义的scala语言的含义,此处未定义的含义精确地表示“没有定义”。

因此,我不会说您只需要编写Scala代码的定义,因为声明非常有用。但是,对于每个声明,您至少需要一个定义才能使它有用!

答案 1 :(得分:2)

如果我想用scala编写一些应用程序,似乎我所需要的只是定义

可以从纯声明中编写定义。例如考虑

trait Iterator[+A] {
  def hasNext: Boolean
  def next(): A
  def nextOption(): Option[A] = if (hasNext) Some(next()) else None
}

此处nextOption是根据hasNextnext定义的,尽管在此时间点后两者尚未定义。当然,在运行程序时,所有声明都需要与充实的对象链接,但是在编译时,即使有时我们不具备所有这些功能,也可以继续编写程序详细信息。

相关问题