O método "Exigir" em Ruby

Para criar componentes reutilizáveis, que podem ser facilmente usados ​​em outros programas, uma linguagem de programação deve ter alguma maneira de importar esse código sem problemas em tempo de execução. Dentro Rubi, a exigir O método é usado para carregar outro arquivo e executar todos os seus afirmações. Isso serve para importar todas as classes e método definições no arquivo. Além de simplesmente executar todas as instruções no arquivo, o método require também controla quais arquivos foram solicitados anteriormente e, portanto, não exigirá um arquivo duas vezes.

Usando o método 'require'

O método require leva o nome do arquivo a ser solicitado, como um corda, como um único argumento. Esse pode ser um caminho para o arquivo, como ./lib/some_library.rb ou um nome abreviado, como some_library. Se o argumento for um caminho e um nome completo do arquivo, o método de requisição procurará ali o arquivo. No entanto, se o argumento for um nome abreviado, o método require procurará por um número de diretórios predefinidos em seu sistema para esse arquivo. Usar o nome abreviado é a maneira mais comum de usar o método require.

instagram viewer

O exemplo a seguir demonstra como usar a instrução require. O arquivo test_library.rb está no primeiro bloco de código. Este arquivo imprime uma mensagem e define uma nova classe. O segundo bloco de código é o arquivo test_program.rb. Este arquivo carrega o test_library.rb usando o método lá e cria um novo TestClass objeto.

coloca "test_library incluído"
classe TestClass
def inicializar
coloca "Objeto TestClass criado"
fim
fim
#! / usr / bin / env ruby
requer 'test_library.rb'
t = TestClass.new

Evitar conflitos de nome

Ao escrever componentes reutilizáveis, é melhor não declarar muitas variáveis ​​no escopo global fora de nenhuma classe ou método ou usar o método $ prefixo. Isso é para evitar algo chamado "poluição de namespace"Se você declarar muitos nomes, outro programa ou biblioteca poderá declarar o mesmo nome e causar um conflito de nomes. Quando duas bibliotecas completamente independentes começam a mudar as variáveis ​​umas das outras acidentalmente, as coisas acontecem - aparentemente aleatoriamente. Este é um bug muito difícil de rastrear e é melhor apenas evitá-lo.

Para evitar conflitos de nome, você pode incluir tudo na sua biblioteca dentro de um módulo declaração. Isso exigirá que as pessoas consultem suas classes e métodos por um nome totalmente qualificado, como MyLibrary:: my_method, mas vale a pena, pois geralmente não ocorrem conflitos de nome. Para pessoas que desejam ter todos os nomes de classe e método no escopo global, eles podem fazer isso usando o incluir declaração.

O exemplo a seguir repete o exemplo anterior, mas inclui tudo em um Minha biblioteca módulo. Duas versões de my_program.rb são dados; aquele que usa o incluir declaração e uma que não.

coloca "test_library incluído"
módulo MyLibrary
classe TestClass
def inicializar
coloca "Objeto TestClass criado"
fim
fim
fim
#! / usr / bin / env ruby
requer 'test_library2.rb'
t = MyLibrary:: TestClass.new
#! / usr / bin / env ruby
requer 'test_library2.rb'
inclua MyLibrary
t = TestClass.new

Evitar caminhos absolutos

Como os componentes reutilizáveis ​​costumam ser movimentados, também é melhor não usar caminhos absolutos nas chamadas necessárias. Um caminho absoluto é um caminho como /home/user/code/library.rb. Você notará que o arquivo deve estar no local exato para funcionar. Se o script for movido ou o diretório inicial mudar, essa instrução requererá de funcionar.

Em vez de caminhos absolutos, geralmente é comum criar um ./lib diretório no diretório do seu programa Ruby. o ./lib diretório é adicionado ao $ LOAD_PATH variável que armazena os diretórios nos quais o método exigem procura por arquivos Ruby. Depois disso, se o arquivo my_library.rb é armazenado no diretório lib, ele pode ser carregado no seu programa com um simples requer 'minha_library' declaração.

O exemplo a seguir é o mesmo que o anterior test_program.rb exemplos. No entanto, pressupõe a test_library.rb arquivo é armazenado no ./lib diretório e carrega-o usando o método descrito acima.

#! / usr / bin / env ruby
$ LOAD_PATH << './lib'
requer 'test_library.rb'
t = TestClass.new