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 コンパイラーはそれを最適化して取り除くことができるのでしょうか? 文字列が不変であることを知っています。

4

1 に答える 1

7

.toLowerCase常に同じ結果を返し、副作用がないことをコンパイラが何らかの形で知っていれば、.toLowerCase同じオブジェクトに対する複数の呼び出しを 1 回の呼び出しに最適化できます。ただし、それを知ることはできません。あなたの例では、それは真実ではありません。たとえば、使用されるデフォルトのロケールに応じて"I".toLowerCase"i"または"ı". デフォルトのロケールは呼び出しごとに変わる可能性があるため、このような最適化は有効ではありません。

于 2012-10-27T15:24:47.080 に答える