2012-10-27 23 views
2

冗餘呼叫考慮這個Scala代碼優化的不可變對象

val word = str.toLowerCase 
val chars = word.distinct.sorted 

再後來

//chars.map(c => str.toLowerCase.count(_ == c)) 
chars.map(c => word.count(_ == c)) 

我創建了val word避免創建地圖新小寫的字符串。但是,從理論上講,Scala編譯器能夠優化它嗎?它知道字符串是不可變的。

回答

7

如果編譯器以某種方式知道.toLowerCase總是返回相同的結果並且沒有任何副作用,它可以優化幾次調用.toLowerCase在同一對象上的一次調用。但是,它不能知道,在你的例子中它甚至不是真的。例如,根據使用的默認語言環境,"I".toLowerCase可能是"i""ı"。由於默認語言環境可能會在不同的調用之間改變,所以這種優化將無效。

+0

如果這是在一種方法內,'str'如何改變? –

+0

我從來沒有說過'str'可以改變。 –