使用命名空間是組織程式碼的重要方法。
類別和模組都能提供命名空間。
兩個方法可能發生命名衝突,只要把它們放進不同的命名空間就能解決。
命名空間可以巢狀,這有助於組織大型程式碼庫。
存取命名空間要透過作用域解析運算子::。
下面的範例展示了兩個不同的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
你在一間專門處理特殊遺囑委託的知名律師事務所工作。
在這個練習中,你將要打開一座神祕的保險庫。 你是這份遺產的執行人,必須組合三個家族長久保管的祕密代碼,才能取得一組帳號和對應的密碼。
為了防止任何一個家族獨自打開保險庫,必須結合他們的資訊,再加上你從遺囑中得知的祕密修飾值,才能打開它。
你有三個任務,全都和協助這些家族打開保險庫有關。
定義一個名為 EstateExecutor 的命名空間。
接下來幾個任務的程式碼,都應該定義在 EstateExecutor 命名空間的主體內。
class SomeName
# The space between the class/module name
# and the `end` keyword
# is called body of the namespace.
end
這是你大顯身手的時刻。 只有你握有能揭開祕密帳號的祕密修飾值。
定義 assemble_account_number(secret_modifier) 方法,它接受型別為 Integer 的祕密修飾值作為引數,並回傳 Integer 型別的組合後帳號。
要取得正確的號碼,你必須把三個家族的 bank_number_part 加總起來。
遺囑中的指示要求你先將所有藍色片段相加,再將所有紅色片段相加。 得到的代碼,則是將這兩個總和相乘。
定義 assemble_code 方法,把三個家族的片段組合成單一的 Integer 結果,並回傳得到的代碼。
這個方法不接受任何引數,只依賴各家族相關命名空間中的資訊。