2012-06-07 96 views
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` 
    } 
} 

如何確保它不會返回一個單位?

回答

5

在Java制定者通常與void返回類型定義:

public void setObj(StripeObject name); 

斯卡拉當量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 

這僅僅是制定者的公約,雖然,你可以很容易地返回值,如果你想:

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

這將是一個有點不尋常,但並不可能會引起問題,甚至誰是期待Unit呼叫者。

+0

+1用於顯示多種語法;) – crockpotveggies

2

我花了一段時間來解決這個問題,但是在Scala中,作業不像Java那樣返回值。不知道他們爲什麼這樣做,但他們做到了。下面是一些示例代碼,這樣你就可以在Scala的控制檯中看到它:

scala> var number = 30 
number: Int = 30 

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

所以你需要在方法返回object。另外,儘量避免在代碼中使用語言關鍵字,儘管這是可能的,但這會導致難以閱讀的代碼。

+0

有趣的是,這不是我第一次聽到避免'this'。部分麻煩是我將Java代碼移植到Scala,所以我正在向左和向右轟擊炸彈。我認爲返回行爲與避免「返回」語句並加速編譯器的願望有關。但我不完全有資格作出這樣的聲明;) – crockpotveggies

+0

不,不**這**,我的意思是使用**對象**關鍵字,你**應**使用**這**; D –

+0

哎呀抱歉,這是我自己的錯:D – crockpotveggies

2

在你看到

whatever = something 

whatever = something ; whatever 

取代它,你會沒事的每一個案件。作業確實返回Unit。所以簡單地重申你想要返回的東西。