學習軌道
/
Ruby
Ruby
/
練習
/
巴勒莫港
巴勒莫港

巴勒莫港

學習練習

簡介

符號是具名的識別碼,可以用來指向某個值。 符號是透過符號字面值建立的,做法是在名稱前面加上:字元,例如:foo。 符號也可以寫成加上引號的形式,例如:"foo",這樣一來名稱中就能包含空格等字元。

:foo # => :foo
:"foo boo" # => :"foo boo"

符號在 Ruby 中許多地方都會用到,包括作為雜湊的鍵,以及代表方法名稱和變數名稱。

識別碼

符號和字串不同的地方在於,它們是識別碼,而不是代表資料或文字。 這表示同名的兩個符號永遠是同一個物件。

"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748

修改符號

符號是不可變的,也就是說它們無法被修改。 這表示當你「修改」一個符號時,其實是建立了一個新的符號。 有幾個方法可以用來操作符號,它們全都會回傳新的符號。 所有的方法都可以在 Symbol API 裡找到。

:foo.upcase # => :FOO

:foo.object_id # => 1086748
:foo.upcase.object_id # => 60

符號不可變的好處是,它們比字串更節省記憶體,而且作為識別碼使用時也更安全。

轉換

符號可以轉換成字串,反之亦然。 當你想修改一個符號,或是想把符號當作字串使用時,這就很有用。 要把字串呈現為符號,可以使用String#to_sym方法;反過來則可以使用Symbol#to_s方法。 由於符號可用的方法有限,所以如果需要一個新的符號,先把符號轉成字串,以便對它使用字串的方法,可能會很有用。

:foo.to_s # => "foo"
"foo".to_sym # => :foo

說明

巴勒莫港是個繁忙的港口,許多船隻來來往往。長久以來,這裡一直用人工方式記錄目前停泊在港內的船隻。這套系統非常容易出錯,於是港務主管決定改用電腦化的系統來取代它。

港務主管聘請你來實作這套新系統。這套系統除了要處理船隻的識別碼,還要處理目的地的識別碼。

1. 建立港口的識別碼

你首先要做的,是建立巴勒莫港的識別碼。識別碼是港口名稱的前四個字母,並以大寫表示。

將 Port::IDENTIFIER 常數定義為符號,其值為 :PALE。

Port::IDENTIFIER 
# => :PALE

2. 取得其他港口的識別碼

程式還必須處理其他港口,所以你也得為它們建立識別碼。港口希望這套系統能自動化,而由於各港口的命名慣例不同,識別碼應該由港口名稱產生。識別碼是港口名稱的前四個字母,並以大寫表示。

定義 Port.get_identifier 方法,讓它接受一個字串作為引數,並以符號形式回傳該港口的識別碼。

Port.get_identifier("Hamburg") 
# => :HAMB

3. 判斷船隻應該停靠哪個碼頭

港口有兩個碼頭,系統需要判斷船隻應該停靠在哪一個。碼頭是由船隻的識別碼決定的。

識別碼由兩個部分組成:第一部分是三個大寫字母,代表船隻載運的貨物;接著是三個數字,也就是這艘船唯一的識別碼。

如果船隻的識別碼顯示它載運的是 OIL或GAS,船隻就應該停靠在碼頭A。否則,船隻應該停靠在碼頭B。

定義 Port.get_terminal 方法,讓它接受一個符號作為引數,也就是船隻的識別碼。這個方法應該以符號回傳碼頭。

Port.get_terminal(:OIL123)
# => :A
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Ruby Exercism

準備好開始 巴勒莫港 了嗎?

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