官术网_书友最值得收藏!

2.4 字符串的變量代入

問題

你想在一個字符串中使用變量替換,就像使用Perl、PHP和Ruby時一樣。

解決方案

要在Scala中使用基本的字符串插值,需要在字符串前加上字母s,并在字符串中包含需要替換的變量,變量名稱前面需要加上字符$,參照下面的println語句:

根據Scala官方的字符串插值文檔(https://oreil.ly/A3hqn),當在字符串前面加上字母s時,就是在創建一個經過處理的字符串字面量。這個例子使用了“ s字符串插值器”,它可以讓你在字符串中嵌入變量,這些變量將被它們的值取代。

在字符串字面量中使用表達式

除了把簡單的變量放在字符串中,還可以將表達式放在字符串的大括號里,在下面的例子中,會把age加1后的結果放到字符串中:

下面這個例子展示了在大括號中使用相等判斷:

在輸出對象字段時也需要使用大括號:

注意,如果輸出對象字段時不使用大括號,輸出的信息會與預期不符:

討論

放在字符串前面的s實際上是一個方法。雖然這似乎比直接把變量放在字符串里不那么方便,但這么做至少有兩個好處:

·Scala提供了其他插值函數,這讓你有更多的掌控力。

·任何人都可以定義自己的字符串插值函數。例如,Scala的SQL庫就利用了這種能力,可以寫出像sql"SELECT * FROM USERS"的查詢。

我們來看看另外兩個Scala內置的插值函數。

f字符串插值器(printf風格的格式化)

在前面解決方案的例子中,weight的值輸出為200.0。這完全正確,但如果想多輸出幾位小數,或者完全刪除它們,該怎么做呢?

這個簡單的需求催生了“f字符串插值器”,一個可以通過printf格式化內部字符串的方法。接下來的例子會說明如何輸出保留兩位小數的weight:

還會說明如何打印不保留小數的weight:

如上所述,要使用這種方法,只需要做到如下兩步:

·在字符串前加f。

·在變量后使用printf風格的格式化指定符。

printf格式化指定符

最常用的printf格式化指定符會在2.5節中列舉。

雖然這些例子使用了println方法,但需要注意的是,完全可以將變量替換的結果賦給一個新的變量,類似于在其他語言中使用sprintf:

現在s只是一個普通的字符串,可以用在任何需要字符串的地方。

raw插值器

除了s和f字符串插值器之外,Scala還包含另一個叫作raw的插值器。使用raw插值器不會對字符串里的任何轉義字符進行轉義。下面這個例子是對raw與s插值器進行比較:

如上所示,s會對\n轉義成換行符,而raw不對其做任何轉義,只是將其當作普通字符處理。

創建自定義插值器

除了s、f和raw插值器,還可以定義自己的插值器。2.11節將給出創建自定義插值器的例子。

另見

·2.5節將列舉許多常用的字符串格式化的字符。

·Oracle Formatter類文檔(https://oreil.ly/gEAsi)有一個完整的、可以使用的格式化字符的列表。

·Scala官方字符串插值頁面(https://oreil.ly/A3hqn)有更多關于插值器的細節。

·2.11節將給出創建自定義插值器的例子。

主站蜘蛛池模板: 台北县| 昌图县| 乌拉特中旗| 宾阳县| 始兴县| 岑溪市| 禹城市| 大兴区| 集安市| 砚山县| 丰台区| 化隆| 上虞市| 合山市| 雅安市| 威远县| 毕节市| 南岸区| 青神县| 璧山县| 温州市| 涪陵区| 绿春县| 西华县| 康平县| 云霄县| 铁岭县| 白玉县| 长垣县| 正蓝旗| 大兴区| 珠海市| 舒城县| 泾阳县| 伊春市| 崇州市| 珲春市| 揭西县| 壶关县| 合川市| 宝鸡市|