Uma forma importante de organizar o código é o recurso a espaços de nomes.
As classes e os módulos fornecem espaços de nomes.
Dois métodos podem ter uma colisão de nomes, que se pode resolver colocando-os em espaços de nomes diferentes.
Os espaços de nomes podem ser aninhados, o que pode ajudar a estruturar grandes bases de código.
O acesso aos espaços de nomes faz-se através do operador de resolução de âmbito ::.
O exemplo abaixo mostra a utilização de dois métodos foo diferentes.
São usados em conjunto ao prefixar os respetivos espaços de nomes.
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
Repara que os espaços de nomes são interpretados com base no local onde está o código em execução.
Para te referires a algo no espaço de nomes raiz (ou seja, fora de todos os espaços de nomes definidos), começa por ::.
Por exemplo:
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
Trabalhas numa prestigiada sociedade de advogados especializada em tratar de pedidos de testamento invulgares.
Neste exercício, vais abrir um cofre misterioso. És o testamenteiro da herança e vais juntar os códigos secretos há muito guardados de três famílias para obter um número de conta e o código correspondente.
Para impedir que qualquer família abra o cofre sozinha, este só pode ser aberto combinando o conhecimento das famílias com um modificador secreto que conheces do testamento.
Tens três tarefas, todas relacionadas com ajudar as famílias a abrir o cofre.
Define um namespace chamado EstateExecutor.
O código das tarefas seguintes deve ser definido no corpo do namespace EstateExecutor.
class SomeName
# The space between the class/module name
# and the `end` keyword
# is called body of the namespace.
end
Este é o teu grande momento. Só tu tens a chave do modificador secreto para revelar o número de conta secreto.
Define o método assemble_account_number(secret_modifier), que recebe como argumento o modificador secreto, do tipo Integer, e devolve o número de conta reunido, também do tipo Integer.
Para obteres o número correto, tens de somar a bank_number_part de cada uma das três famílias.
As instruções do testamento pedem-te que juntes primeiro todos os fragmentos azuis e depois todos os vermelhos. O código resultante obtém-se multiplicando as duas somas.
Define o método assemble_code, que devolve o código resultante, combinando os fragmentos das três famílias num único resultado do tipo Integer.
O método não tem argumentos e baseia-se apenas na informação contida nos namespaces relevantes das famílias.
Inscreve-te no Exercism para aprenderes e dominares Ruby com 21 conceitos121 exercícios, e mentoria humana real, tudo grátis.