遺言

遺言

学習演習

はじめに

コードを整理するための重要な方法のひとつが、名前空間の利用です。 クラスとモジュールは名前空間を提供します。 2つのメソッドの名前が衝突することがありますが、それぞれを別の名前空間に置けば解決できます。 名前空間は入れ子にできるので、大きなコードベースを構造化するのに役立ちます。 名前空間へのアクセスには、スコープ解決演算子::を使います。

次の例では、2つの異なるfooメソッドを使っています。 それぞれの名前空間を前に付けることで、両者を一緒に使えます。

class MyNamespace
  def self.foo
    44
  end

  class MyInnerNamespace
    def self.baz
      90
    end
  end
end

class MyOtherNamespace
  def self.foo
    -2
  end
end

p MyNamespace::foo + MyOtherNamespace::foo * MyNamespace::MyInnerNamespace::baz  # => -136

名前空間は、実行中のコードがどの位置にあるかによって解釈されることに注意してください。 ルート名前空間(つまり、定義されたすべての名前空間の外側)にあるものを参照するには、先頭に::を付けます。

たとえば、次のようになります。

class Example
  def self.example
    5
  end
end

class MyNamespace

  class Example
    def self.example
      10
    end
  end

  def self.call_example
    p Example::example  # => 10
    p ::Example::example  # => 5
  end
end

説明

ここは、風変わりな遺言の依頼を専門に扱う一流の法律事務所です。

この演習では、謎に包まれた金庫を開けることになります。遺言執行者として、3つの家系が長く守ってきた秘密のコードを組み合わせ、口座番号とそれに対応するコードを手に入れましょう。

どの家系も単独では金庫を開けられないようにするため、金庫は、それぞれの家系の知識に、遺言から知ることになる秘密の修飾子を組み合わせたときにだけ開くようになっています。

家系が金庫を開けるのを手助けするための、3つのタスクがあります。

EstateExecutorという名前の名前空間を定義します。以降のタスクのコードは、EstateExecutor名前空間の本体の中に定義します。

class SomeName
  # The space between the class/module name
  # and the `end` keyword
  # is called body of the  namespace.
end

いよいよ本番です。秘密の口座番号を明かすための秘密の修飾キーを持っているのは、ここでは1人だけです。

Integerの秘密の修飾子を引数に取り、組み立てられた口座番号をIntegerとして返す、assemble_account_number(secret_modifier)メソッドを定義します。

正しい番号を求めるには、3つの家系それぞれのbank_number_partを合計します。

遺言の指示では、まず青い断片をすべて足し、次に赤い断片をすべて足すよう求められています。できあがるコードは、この2つの合計を掛け合わせることで得られます。

3つの家系の断片を組み合わせて1つのIntegerの結果とし、できあがるコードを返すassemble_codeメソッドを定義します。このメソッドは引数を取らず、家系の該当する名前空間にある情報だけを使います。

作成者

  • @vaeng(オリジナルのC++演習)
  • @vaiapatta1985(Rubyへの移植)
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Ruby Exercism

遺言を始める準備はできましたか?

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