トラック
/
Ruby
Ruby
/
演習
/
パレルモ港
パレルモ港

パレルモ港

学習演習

はじめに

シンボルは、値の参照に使える名前付きの識別子です。シンボルはシンボルリテラルで作成します。シンボルリテラルとは、名前の前に:を付けたもので、たとえば:fooのようになります。引用符で囲んで書くこともでき、たとえば:"foo"のように書くと、名前にスペースを含められます。

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

シンボルはこの言語のさまざまな場所で使われています。ハッシュのキーとして使ったり、メソッド名や変数名を表したりします。

識別子

シンボルが文字列と違うのは、シンボルが識別子であり、データやテキストを表さないという点です。つまり、同じ名前のシンボルは常に同じオブジェクトになります。

"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. 港の識別子を作成する

まず最初に、パレルモ港の識別子を作成します。 識別子は、港の名前の最初の4文字を大文字にしたものです。

Port::IDENTIFIER定数を、値が:PALEのシンボルとして定義します。

Port::IDENTIFIER 
# => :PALE

2. 他の港の識別子を取得する

プログラムは他の港も扱う必要があるので、それらの識別子も作成します。 港はシステムの自動化を望んでおり、港ごとに命名規則が異なるため、識別子は港の名前から生成する必要があります。 識別子は、港の名前の最初の4文字を大文字にしたものです。

Port.get_identifierメソッドを、文字列を引数に取り、その港の識別子をシンボルとして返すように定義します。

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

3. 船がどのターミナルに停泊すべきか判断する

港には2つのターミナルがあり、システムは船がどのターミナルに停泊すべきかを判断する必要があります。 ターミナルは、船の識別子によって決まります。

識別子は2つの部分からできています。最初の部分は、その船がどの積荷を運んでいるかを表す3つの大文字で、その後に船を一意に識別する3つの数字が続きます。

船の識別子がOILまたはGASを運んでいる場合は、その船はターミナルAに停泊します。 それ以外の場合は、ターミナルBに停泊します。

Port.get_terminalメソッドを、船の識別子であるシンボルを引数に取るように定義します。 このメソッドは、ターミナルをシンボルとして返します。

Port.get_terminal(:OIL123)
# => :A
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Ruby Exercism

パレルモ港を始める準備はできましたか?

Exercismに登録すれば、21個のコンセプト121個の演習、そして本物の人間によるメンタリングとともに、Rubyを学んでマスターできます。すべて無料です。