在scala中强制要求_ = in setter

时间:2018-01-16 07:20:19

标签: scala

我很困惑为什么在Scala中使用_ =在Scala中我已经编写了一个程序而没有使用_ =并且使用_ =输出是相同的。 请帮助我解决我的困惑,实际上我是Scala的新手

class BankAccount {
  private var _balance = 0
  def balance = _balance
  def balance(bal:Int) = {_balance=bal}
def deposit(amount:Int): Unit =
  {
    _balance = amount
  }
}

object bank extends App {
  val bankAccount = new BankAccount
  bankAccount.deposit(1500)
  println(bankAccount.balance) //1500
  bankAccount.balance(6000)
  println(bankAccount.balance) /6000

}

_ =仅命名约定或它起任何作用吗?

3 个答案:

答案 0 :(得分:4)

如果您的名称只是balance,则getter方法会出现命名冲突。即

class BankAccount {
  private var balance = 0
  def balance = balance //A naming conflict occurs here, as both the def and the variable are called balance.
  def balance(bal:Int) = balance = bal //Another conflict,as balance could refer to either the variable or the def    
}

作为旁注,你不会(不应该)在scala中真正编写类似的代码。可变变量不是很好,所以理想情况下你会改为使用以下类:

case class BankAccount(balance: Int = 0)

这将使balance不可变并自动为其生成getter。

val bank = BankAccount(300)
println(bank.balance)

如果你需要它是可变的 - 这不是一个好主意或必要 - 通常你只需创建一个新的BankAccount实例。但是如果你需要它,你可以通过这样做轻松地使它变得可变:

case class BankAccount(var balance: Int = 0)

现在还可以使用平衡器设置器,因此您可以这样做:

val bank = BankAccount(300)
bank.balance = 400
println(bank.balance) //Will print 400

答案 1 :(得分:2)

以下是如何使用代码示例的_=约定。

private var _balance = 0
def balance:Int = _balance            //the getter
def balance_=(bal:Int) {_balance=bal} //the setter
def deposit(amount:Int): Unit = {_balance = amount}

用法:

val bankAccount = new BankAccount
bankAccount.deposit(1500)
println(bankAccount.balance) //1500
bankAccount.balance = 6000   //this is how to use the setter
println(bankAccount.balance) //6000

答案 2 :(得分:0)

是一种惯例。

您可以在以下链接中查看有关命名约定的官方文档。

https://docs.scala-lang.org/style/naming-conventions.html

遵循惯例以确保代码的质量和可操作性非常重要。