1

写出一个 Scala 类,这里的问题是编译器认为代码是一个没有返回正确值的单元。这是一种用于在类中设置属性的方法:

def setObject(`object`:StripeObject):StripeObject = {
    this.`object` = `object`
  }

错误是:type mismatch; found : Unit required: com.stripe.StripeObject

完整的课程是:

case class EventData(var previousAttributes: HashMap[String,Object], var `object`:StripeObject) extends StripeObject {

  def getPreviousAttributes = {
    previousAttributes
  }

  def setPreviousAttributes(previousAttributes: HashMap[String, Object]) = {
    this.previousAttributes = previousAttributes
  }

  def getObject = {
    `object`
  }

  def setObject(`object`:StripeObject):StripeObject = {
    this.`object` = `object`
  }
}

如何确保它不返回单位?

4

3 回答 3

5

在 Java 中,setter 通常用void返回类型定义:

public void setObj(StripeObject name);

Scala 的等价物是Unit,它也是赋值表达式的值。因此,在 Scala 中,您将编写一个 setter 作为以下之一(它们都是等价的,第一个是最惯用的):

def setObj(obj: StripeObject) {
  this.obj = obj
}

def setObj(obj: StripeObject): Unit = {
  this.obj = obj
}

def setObj(obj: StripeObject) = this.obj = obj

不过,这只是 setter 的约定,如果需要,您可以轻松地返回该值:

def setObj(obj: StripeObject): StripeObject = {
  this.obj = obj
  obj
}

这有点不寻常,但不太可能引起问题,即使对于期待Unit.

于 2012-06-07T22:35:58.940 回答
2

在你看到的每一种情况下

whatever = something

将其替换为

whatever = something ; whatever

你会没事的。分配确实返回Unit。因此,只需重述您想要返回的内容。

于 2012-06-07T22:33:51.287 回答
2

我花了一些时间来解决这个问题,但在 Scala 中,赋值不会像在 Java 中那样返回值。不知道他们为什么这样做,但他们做到了。这是一些示例代码,您可以在 Scala 控制台中看到它:

scala> var number = 30
number: Int = 30

scala> var otherNumber = number = 40
otherNumber: Unit = ()

所以你需要object在方法中返回。此外,避免在代码中像这样使用语言关键字,即使这是可能的,它也会使代码更难阅读。

于 2012-06-07T22:27:14.353 回答