2016-04-20 70 views
2

我是scala新手。我在寫的模式如下匹配:模式匹配案例中的模式替代scala錯誤非法變量

val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo") 
    show(capitals.get("test")) 
    def show(x: Option[String]) = x match { 
    case Some(s) | None => s 
    } 

我得到錯誤:

Error: illegal variable in pattern alternative 
    case Some(s) | None => s 
      ^

我想知道怎樣才能達到或條件像我有,如果在JAVA語句

if (str == null || str.isEmpty())

你能幫助重寫代碼或指出錯誤嗎?

問:我如何在案例模式匹配中提及或調理?

回答

1

這是模式上的選項如何搭配:

def show(x: Option[String]) = x match { 
    case Some(s) => s 
    case None => "N/A" 
} 

(順便說一下,你也可以做這樣的事情):

capitals.get("test").getOrElse("N/A") 

現在,添加或條件模式匹配的情況下,你不能使用綁定變量。這將工作,但是:

def show(x: Option[String]) = x match { 
    case Some(_) | None => "a" 
} 

注意,唯一的區別是在Some(_),而不是你的Some(s)。使用Some(s)就沒有太大的意義,因爲你不能重用s反正(如果None來了,你會s是在這種情況下?)

+0

這是信息。我正在嘗試的是什麼?忽略這種情況..可能或聲明是可能的?我有三個案例說一些[],案件無,案件_。相反,寫三個案件,我想找到我是否可以把它作爲或。就像我想要做一個或一個條件的操作。我如何實現它,而不是寫兩個案例? – happybayes

+0

@happybayes看到編輯答案 – slouc

+0

感謝您的洞察力的答案。這正是我所期待的。 – happybayes

2

匹配Some(s) | None沒有意義,因爲if (true || false)(只是沒有操作,因爲它不派遣個案)。

x match { 
    case Some(s) => println(s"Some($s)") 
    case _ => println("_None") 
} 
2

我覺得這是你想要達到的目的。如果s在地圖返回中有一個值,s。如果s在地圖中沒有值,則返回一條指示如此的消息。

val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo") 

def show(x: Option[String]) = x match { 
    case Some(s) => s 
    case None  => "x has no value" 
} 

show(capitals.get("mani")) 

show類似的和更簡潔版本是capitals.get("mani").getOrElse("No value found")返回 No value found

此外,您可以使用警衛來檢查s上的各種條件,例如第一個字符是否爲大寫。如果s以大寫字母開頭,則第一個案例只會匹配。

def show(x: Option[String]) = x match { 
    case Some(s) if(s.head.isUpper) => s 
    case None  => "No value" 
}