2011-03-24 94 views
1

我剛開始學習scala,也許我有點野心。我想將String映射到從StringBoolean的函數。不幸的是,我並不瞭解我從編譯器得到的反饋。下面是代碼:斯卡拉函數圖

所有的
class StdRead { 
    def read(key : Array[Int], value : Array[Int],seperator : Array[Char], 
     filter : Map[Int, String => Boolean], write : String => Unit) { 
    for(ln <- stdin.getLines) { 
     val inarr = ln split seperator 
     for(i <- key) { 
      val func = filter get i //func : Option[(String) => Boolean] 
      val f = func getOrElse Unit //f : java.lang.Object 
      val res = func(inarr(i)) //Error, doesn't work 
     } 
     //more stuff   
    } 
} 

第一,爲什麼我得到一個Option,是唯一的方式來訪問該功能。其次,getOrElse爲什麼返回一個對象?難道這不是我可以用來調用函數的東西嗎?如果有人能給我一個簡單的例子來說明我在這裏需要做什麼,那將是非常棒的。

在此先感謝。

+0

順便說一句,它是「sepArator」,而不是「sepErator」。 – 2011-03-24 20:34:36

+1

@ DanielC.Sobral有些人有不同的文化,我認爲你的文化是事實上的,它是以民族爲中心的。就像OP一樣,我也是來自有時使用E形式而不是A形式的文化。 – bharal 2013-07-18 15:17:22

+0

@bharal對不起,如果你有這種感覺。我找不到任何字典顯示「分隔符」是正確的拼寫。我看不出有什麼理由不幫助其他人改善拼寫錯誤。你不應該因爲幫助別人而責備我,你應該幫助我,通過給出這些拼寫和參考文獻的實際例子來證實這確實是對你的文化的有效拼寫,而不是你的錯誤。 – 2013-07-19 18:01:38

回答

3

如果您確定某個地圖上有某個關鍵字,您可以直接抓住它:filter(i)。如果您不確定(或者更加小心錯誤),則使用get方法。它返回一個選項,您已經從中正確決定使用getOrElse。但是,您想要getOrElse((s:String) => /* some boolean */),也就是說,您還必須從那裏返回StringBoolean的函數。然後,您可以應用f,這將是從地圖中成功獲取的功能,或者您在getOrElse中提供的任何默認功能。

當你告訴它返回Unit是,他們認爲,可以這麼說,「好,你說,如果它的存在,它是一個函數,如果不是它的一個單元......這意味着,所有我能發生什麼事了說類型是它是一個對象。「

不管怎麼說,像

val f = func getOrElse (s: String) => true 
val res = inarr.filter(f) 

會做什麼,我認爲你正在試圖做的(這是在使用從地圖檢索功能的陣列inarr進行篩選)。

+0

啊!我知道了。謝啦。我以爲我正在使用'Unit'來幫助自己,並推遲決定什麼時候到來。一直以來,我都在腳下開槍自殺。 – delmet 2011-03-24 05:09:38

4

獺指出,Map.get類型爲A => Option[B],而應用方法的類型爲A => B,但是這是一個謊言,因爲它可能會拋出異常。一般來說,由於這個謊言,我建議不要使用申請表。

在您的具體示例中,您可能根本不應該使用getOrElse;相反,因爲你正在做的只是產生副作用,請嘗試如下所示。我更改了名稱'filter',因爲這實際上也是Map和其他迭代器中重要方法的名稱,並且重載該名稱是不必要的混淆源。

class StdRead { 
    def read(key : Array[Int], value : Array[Int],seperator : Array[Char], 
     stringTests : Map[Int, String => Boolean], write : String => Unit) { 
    for { 
     ln <- stdin.getLines 
     val inarr = ln split seperator 
     i <- key 
     stringTest <- stringTests.get(i) 
    } { 
     stringTest(inarr(i)) 
    } 
    } 
} 

請注意,您可以在for的理解表達式中聲明值。請記住,這些不是循環!

+0

感謝您的回覆。我需要研究「理解」這個難以理解的東西。更多的繩子掛在一起。謝謝!!! – delmet 2011-03-24 05:12:10

+0

理解的好例子! – 2011-03-24 20:38:17