2012-02-24 184 views

回答

3

功能這是指定功能的一種方式。函數是將一個或多個參數作爲輸入並返回輸出的東西。您可以使用=>符號指定函數的一種方法。

s: String => s.length == 4 // a function that takes a String called s as input 
          // and returns a Boolean (true if the length of s is 4 
          // false otherwise) 

在scala中,您可以使用像使用整數或字符串或任何其他類型的基本數據類型的函數。

您可以將它們分配給變量:

scala> val f = (s: String) => s.length==4 // assigning our function to f 
f: String => Boolean = <function1> 

scala> f("abcd") // ...and using it 
res1: Boolean = true 

,你可以將它們作爲參數,其它函數或方法:你說的remove方法

scala> val thrill = List("foo", "bar", "baz", "bazz") 
thrill: List[java.lang.String] = List(foo, bar, baz, bazz) 

scala> thrill.remove(s => s.length == 4) 
warning: there were 1 deprecation warnings; re-run with -deprecation for detail 

res2: List[java.lang.String] = List(foo, bar, baz) 

這裏:「應用這個函數s => s.length == 4到列表中的每個元素,並刪除所有元素,其中該函數返回true「

順便說一下,請注意,remove已被棄用。建議的替代方案是filterNot

scala> thrill.filterNot(s => s.length == 4) 
res3: List[java.lang.String] = List(foo, bar, baz) 
+0

真棒,謝謝: ) – LuckyLuke 2012-02-24 21:37:44

+0

刪除不是一個函數,它是一種方法。這個區別在Scala中非常重要。 (例如函數是對象,方法不是。) – 2012-02-25 00:35:26

+0

@JörgW Mittag yikes!你是對的!修復了我的答案,非常感謝您的接受! – 2012-02-25 14:46:13

2

表達

s => s.length == 4 

表示一個函數,它採用一個字符串(我猜)和返回基於它是否具有長度爲4

val f = s => s.length == 4 
println(f("five")) //prints "true" 
println(f("six")) //prints "false" 

s =>的布爾值部分只是聲明函數的參數名稱(在這種情況下,只有一個:s

1

這就是說「運行功能s => s.length == 4在所有項目上的快感,並刪除任何地方的函數返回true。」從邏輯上講,該函數必須將thrill中包含的單個項目作爲參數,並且必須返回一個布爾值(true或false)。

scala語法s => ...表示lambda函數 - 一種簡寫函數,其中在許多情況下函數的參數和返回類型被推斷。例如,在這種情況下,編譯器足夠聰明,知道如果快感包含字符串,則s必須是字符串。同樣,它可以以靜態類型的方式確認返回值(s.length == 4)是一個布爾值,並且滿足布爾返回值的要求。

總之:把它看成定義爲boolean f(String s) { return s.length == 4; }

1

我相信所有的以下都是彼此相同(雖然我是斯卡拉福利局也隨時提供勘誤的內容)

thrill.remove((s:String) => s.length == 4) 
thrill.remove(s => s.length == 4) 
thrill.remove(_.length == 4) 
+0

這裏使用'return'錯誤(在REPL中嘗試它,你會得到'error:return outside method definition')。你可能會喜歡使用'Function1'特性來包含定義沒有糖的函數...... :) – 2012-02-24 21:59:53

+0

thx,我稍後再嘗試FUnction1,現在我拿出了有問題的回報。我沒有在這裏安裝REPL,所以我在嘗試http://ideone.com/,它不起作用 - 現在我知道爲什麼 – 2012-02-24 22:22:23