2013-05-27 17 views
1

創建一個新的情況下,對象我有一個非常簡單的例子類名爲FooPosition:Scala的模式匹配 - 錯誤而從另一個

case class FooPosition(x: Int, y: Int) 

和具有FooPosition一個Foo類。我有興趣創建一個函數,該函數僅返回-1,其座標相對於Foo對象等於(x-1, y),並在其他位置返回0。所以我寫道:

class Foo(position: FooPosition) { 
    def bar = (p: FooPosition) => p match { 
    case FooPosition(position.x - 1, position.y) => -1 
    case FooPosition(_, _) => 0 
    } 
} 

這導致錯誤,說:「找不到:值 - 」。有趣的是,

val myFoo = FooPosition(1, 0) 
val newFoo = FooPosition(myFoo.x - 1, myFoo.y) 

工作得很好。我明顯錯過了一些關於模式匹配的東西(因爲我是初學者)。但是,對於這個問題,優雅的解決方案是什麼?我已經解決了這個問題使用

class Foo(position: FooPosition) { 
    private val left = FooPosition(position.x - 1, position.y) 
    def bar = (p: FooPosition) => p match { 
    case `left` => -1 
    case FooPosition(_, _) => 0 
    } 
} 

但我認爲必須有更好的方法。

在此先感謝。

回答

5

你不能在模式匹配中使用這種語法。但這裏有兩個選項 - 第一個是使用guards

def bar = (p: FooPosition) => p match { 
    case FooPosition(x, _) if (x == p.x - 1) => -1 
    case _ => 0 
} 

這裏_表示什麼,我不關心實際值

二是要匹配的值(用大寫名稱值將匹配由它而不是產生新的別名值):

def bar = (p: FooPosition) => { 
    val Px = p.x - 1 
    p match { 
     case FooPosition(Px, _) => -1 
     case _ => 0 
    } 
} 

最後,你的代碼將始終默認爲0 - 你給它一些點p,然後期待它的X座標減少一個單位。也許,你應該寫

def bar(p: FooPosition) = p match { 
     case FooPosition(x, _) if (x == p.x -1) => -1 
     case _ => 0 
} 

代替

+0

哎呦,我犯了一個錯誤,同時簡化了問題,所以你說,它總是默認爲0。編輯它。 非常感謝您的回答。 – Emre