學習軌道
/
Crystal
Crystal
/
練習
/
派對機器人
派對機器人

派對機器人

學習練習

簡介

Crystal 有一個稱為String的型別,用來表示文字。 Crystal 的字串是一連串的 Unicode 字元。 字串是不可變的,這代表一旦建立之後就無法更改。 也就是說,每次修改字串時都會建立新的字串;因此,原始字串不會被修改。

要定義字串,使用雙引號"。

"Hello World"

串接

要串接兩個字串,請使用+運算子。 +運算子會回傳一個結合這兩個字串的新字串。

hello = "Hello"
hello + " World"
# => "Hello World"

字串與數字之間的轉換

to_i方法會將字串轉換成整數。 或者,也可以用to_f方法回傳浮點數。 如果字串無法轉換成數字,就會拋出ArgumentError。

"1".to_i
# => 1

"1.0".to_f
# => 1.0

"Hello".to_i
# => ArgumentError: Invalid integer: Hello

使用to_s方法可以將整數或浮點數轉換成字串。

1.to_s
# => "1"

1.0.to_s
# => "1.0"

內插

內插是一種方便的方式,可以結合字串並在字串中嵌入運算式。 要內插字串,可以使用#字元,後面接著大括號{},並把運算式放在大括號裡。

name = "World"
"Hello #{name}!"
# => "Hello World!"

Crystal 會自動將運算式的結果轉換成字串。

"Hello #{1 + 1}!"
# => "Hello 2!"

長度

當你需要知道字串中有多少個字元時,可以使用size方法,它會以整數回傳字串的長度。 字串的長度是字串本身儲存的屬性,所以每次呼叫這個方法時不必重新計算長度,因此速度非常快。

"Hello World".size
# => 11

索引

索引是指你想從字串中取得特定字元的時候。 要從String取得字元,可以使用大家熟悉的括號表示法。

Note

[]是以 String 實體方法實作的,其中索引就是這個方法的引數。

字串中的第一個字元位於索引 0。

"Hello World"[0]
# => 'H'

"Hello World"[6]
# => 'W'

要從字串結尾取得字元,你可以用字串長度減一來取得最後一個字元的索引,要取得倒數第二個字元,就用字串長度減二,依此類推。 這件事有個捷徑,就是直接使用負索引:最後一個字元位於索引 -1,倒數第二個字元位於索引 -2,依此類推。

name = "Hello World"
name[name.size - 1]
# => 'd'

name[-1]
# => 'd'

跳脫

有些字元無法直接寫在字串裡,而是必須使用跳脫序列。 例如,如果你想在字串裡使用雙引號,就必須將雙引號跳脫。 你可以使用\字元來寫出跳脫序列,後面接著你想跳脫的字元。

以下是 Crystal 中的特殊字元:

值 說明
\a 警示
\b 退格
\e 跳脫
\f 換頁
\n 換行或新行
\r 回車
\t 水平定位字元
\v 垂直定位字元
\\ 反斜線
\' 單引號
\" 雙引號
\377 八進位 ASCII 字元
\xFF 十六進位 ASCII 字元
\uFFFF 十六進位 Unicode 字元
puts "Hello \"World\""
# => Hello "World"

puts "Hello \nWorld"
# => Hello
# => World

多行字串

要寫出多行字串,使用的語法和單行字串相同,只是在字串裡想要有幾行就換幾次行。

"Hello
World"
# => "Hello\nWorld"

說明

從前有一位性格古怪的程式設計師,住在一棟裝了鐵窗的奇特房子裡。 有一天,他在一個線上求職看板上接下了一份工作,要打造一個派對機器人。這個 機器人應該要問候人們,並引導他們入座。第一版非常技術導向,也顯露出這位 程式設計師缺乏與人互動的能力。其中有些特點也被帶到了下一版。

1. 歡迎新賓客來到派對

實作 welcome 方法,使用給定的名字回傳一段歡迎訊息:

PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!

2. 歡迎今天生日的新賓客來到派對

實作 happy_birthday 方法,使用這個人的名字和年齡回傳一段生日訊息。 可惜這位程式設計師有點愛現,所以機器人得展現它對每位賓客生日的了解。

PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!

3. 指引方向

實作 assign_table 函式來指引方向。 它應該接受 5 個參數。

  • 要問候的新賓客名字(String)
  • 桌號(Int)
  • 同桌賓客的名字(String)
  • 找到這張桌子的方向(String)
  • 到這張桌子的距離(Float64)

確切的結果格式可以參考下面的範例。

同桌賓客的名字應該縮寫成名字的第一個和最後一個字母。 Frank 變成 Fk,Christian 變成 Cn,以此類推。

機器人會提供桌號。 機器人也會提到這張桌子的距離。 幸好,精度只限於 1 位數。

PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Crystal Exercism

準備好開始 派對機器人 了嗎?

註冊 Exercism,透過 26 個概念142 個練習 和真人引導來學習並精通 Crystal,全部免費。