Carlos Brando

Nome do Jogo

Como funciona o autoload por dentro

Em dezembro de 2009 eu iniciei uma série de artigos nesse blog que visava explicar em detalhes como alguns mecanismos do Ruby que usamos todos os dias funcionam internamente. Desde então eu publiquei poucos artigos sobre o tema, mas sempre foi um desejo continuar essa série.

Seguindo a linha do último artigo, dessa vez vou explicar como funciona o método autoload.

Antes de começarmos, eu recomendo fortemente que você leia o artigo ”Entendendo os métodos load e require por dentro” que explica o passo-a-passo que o Ruby executa quando carrega um novo arquivo no seu código. Esse artigo lhe dará a base necessária para entender o que se segue.

Para que serve o autoload?

Sei que o método autoload não faz parte do dia a dia de todos, então vejamos primeiro qual é a sua finalidade.

1
2
3
4
5
autoload :MyClass, "my_class"

module X
  autoload :MySubClass, "my_sub_class.rb"
end

No exemplo acima, estamos usando o método em dois contextos diferentes. Em ambos os casos, não desejamos carregar os arquivos my_class.rb e my_sub_class.rb no momento da execução. Porém, quando as constantes MyClass ou MySubClass forem usadas pela primeira vez em nosso código, queremos que o Ruby se encarregue de “auto carregar” os arquivos da mesma forma como faria com a instrução require.

Os arquivos devem possuir uma declaração de suas devidas classes de acordo com a constante utilizada no primeiro argumento do método autoload, como no exemplo abaixo:

my_class.rb
1
2
3
class MyClass
  # ...
end
my_sub_class.rb
1
2
3
4
5
module X
  class MySubClass
    # ...
  end
end

A diferença entre usar autoload ao invés de require é que se a constante nunca for usada, o arquivo correspondente também nunca será carregado. O conceito é bem simples.

Vamos começar do principio

No primeiro exemplo, executamos o método autoload em dois contextos diferentes. A primeira chamada é feita diretamente no main e a segunda no contexto de um módulo. Assim, o objetos Kernel e Module possuem a sua própria versão do método autoload. Essas versões seguem basicamente o mesmo procedimento, mas por hora vamos nos concentrar na versão que está na classe Kernel.

O método autoload sempre irá esperar por dois argumentos: module que pode ser um objeto do tipo String ou um símbolo representando o módulo que será usado em um outro ponto de nosso código e filename que contém o nome do arquivo que desejamos carregar, seguindo as mesmas regras do método require.

Quando o método autoload é executado pela primeira vez, ele analisará se você informou os argumentos corretamente. Se o filename for um texto em branco, por exemplo, ele retornará um erro do tipo ArgumentError.

1
2
autoload :MyClass, ''
# => ArgumentError: empty file name

O segundo passo é verificar se o arquivo especificado já não foi carregado em uma execução do método anterior. Ele faz isso verificando a variável global $LOADED_FEATURES. Se o arquivo já foi carregado antes, a execução do método termina aqui.

Se esse não for o caso, ele verificará se já existe alguma outra declaração de autoload para o mesmo module. Se for encontrado, o filename anterior será substituído pelo novo. Veja um exemplo:

1
2
3
4
5
autoload :MyClass, "arquivo.rb"
autoload?(:MyClass)                     # => "arquivo.rb"

autoload :MyClass, "outro_arquivo.rb"
autoload?(:MyClass)                     # => "outro_arquivo.rb"

No código acima introduzimos o método autoload?, que é útil para confirmar se o módulo já existe na tabela de constantes do Ruby.

1
2
Object.constants.grep /MyClass/
# => [:MyClass]

Como o Ruby entende o autoload?

Nesse ponto eu recomendo que você dê uma outra pausa para ler um texto que facilitará o seu entendimento. Leia o artigo ”Classes são Módulos no Ruby” antes de continuar.

Ao executar autoload, o Ruby carrega o módulo na sua tabela interna de constantes. Mas diferente dos procedimentos normais, ele não armazenará uma instância da classe ou módulo diretamente nessa tabela. Nesse momento ele armazena uma estrutura secundária que contém informações como o nome do módulo, o escopo e o nome do arquivo que deve ser carregado.

Quando a constante for usada pela primeira vez, ela verificará se o objeto resultante é uma instância dessa estrutura Autoload. Se esse for o caso, ele recuperará os dados necessários e executará uma instrução require 'filename' da mesma forma como o artigo mencionado no terceiro parágrafo explicou. O retorno será então o novo módulo ou classe pronto para ser usado.

Onde usar?

Na maioria dos casos você será feliz em usar require ou load para adicionar algum comportamento ao seu código. Porém em algumas gems é comum existirem funcionalidades que não serão usadas por todos. Nesses casos faz muito sentido usar o método autoload para carregar somente o que o será necessário.

Próximos artigos

Como estou sem ideias, eu gostaria de receber sugestões de outros temas para artigos como esse. Se existe algum aspecto ou método do Ruby que você gostaria de entender como funciona por dentro, deixei um comentário abaixo. Até o próximo artigo.

How I do my Computing

Que Richard Stallman tem um conceito bem extremista com respeito a software, todo mundo sabe. Mas é sempre interessante ler a respeito de suas convicções e da forma como ele usa o computador nos dias de hoje.

Burnout

Síndrome de Burnout é muito comum em nossa profissão. Algumas vezes não percebemos os sintomas e em muitas outras simplesmente ignoramos.

Ler o relato de um programador que passou por uma situação extrema de estresse pode servir como um bom alerta para aqueles que viram madrugadas e/ou trabalham por muitas horas sem descanso achando que são super produtivos por isso.

Os sintomas da síndrome de burnout começam com dores de cabeça, tonturas, tremores, falta de ar, oscilações de humor, distúrbios do sono, dificuldade de concentração e problemas digestivos.

Enviando o link da página atual por e-mail

Eu não conhecia esse atalho, mas já está sendo muito útil.

Heroku Add-ons Catalog

Um catálogo muito bem feito de todos os add-ons que o Heroku possui. Criado por Ivan Schneider.

Finalmente um debug para o Ruby 1.9.3

O ruby-debug19 está parado já faz um tempo, o último release foi em setembro de 2009! Então Gabriel Horner fez um fork do projeto e promete mantê-lo atualizado.

Para instalar é simples:

1
$ gem install debugger

Ou adicione em seu projeto Rails:

1
gem "debugger", "~> 1.0.0"

Cinco anos de Nome do Jogo

A cinco anos atrás eu decidi escrever um blog com a finalidade de compartilhar meus estudos na área de desenvolvimento de software. Afinal, a melhor forma de aprender é ensinando. Confesso que escrever com uma boa regularidade não é uma tarefa fácil, mas nesses anos ter construído esse blog foi sem dúvida a melhor coisa que fiz pela minha carreira.

Embora nos últimos anos eu tenho lido mais livros e menos blogs, eu ainda considero esse meio de comunicação muito eficiente. É possível escrever um artigo de forma relativamente rápida e espalhar o conhecimento de uma forma que nem um Twitter ou livro são capazes de fazer.

Desse blog já saíram quase mil artigos, muitos vídeos, dois podcasts de sucesso, dois livros sobre Ruby on Rails (que foram traduzidos para 8 idiomas) e com o apoio de toda a comunidade a tradução do excelente Why’s (Poignant) Guide to Ruby. Sou muito grato aos meus fieis leitores e meu plano é continuar contribuindo para a formação de bons profissionais aqui e no Grok Podcast.

Mudanças no Ruby Inside Brasil

Salve,

Há uns 3 anos o Carlos Brando resolveu trazer o Ruby Inside para o Brasil, a idéia era ser um site de notícias de Ruby que iria traduzir o conteúdo do site original do Peter Cooper e também publicar conteúdo nacional, tudo para ajudar a divulgar o Ruby e o Rails no Brasil, que até então só era utilizado por uma pequena comunidade.

Eu fui um dos primeiros editores e acabei tocando boa parte das traduções, buscando parcerias com outros sites e eventos e as coisas andaram bem, mas chegou um momento onde eu me peguei pensando: porque estamos fazendo isso? Lembro de uma conversa que tive com o Cássio Marques em alguma lista, a ruby-sp ou a rails-br, onde ele falava que traduzir conteúdo não ajudava muito a comunidade, ela tinha que crescer, aprender inglês e ler os originais, e que a tradução não ajudava nisso. Na época discordei, mas depois de um tempo concordei com a opinião dele, e acabei parando as traduções, e o site ficou parado, só uso a conta do Twitter para repassar notícias que acredito ser relevantes para a comunidade.

Hoje o Ruby cresceu muito no Brasil, temos vários grupos de usuários, só o Guru-SP reune por volta de 50 pessoas todos os meses para falar sobre Ruby e tecnologias relacionadas, e a comunidade continua crescendo. Temos várias empresas e consultorias que usam Ruby todos os dias, rubistas famosos no Brasil e no exterior, e talvez o Ruby Inside possa voltar a ajudar a comunidade, mas espero que de uma forma diferente.

No momento, não tenho tempo ou vontade de voltar a tocar o site, e não temos mais o corpo editorial do início, então é o momento de trocarmos a guarda. Esse post é um convite público à comunidade para conversarmos sobre o que se pode fazer com o site, achar gente que esteja disposta a tocá-lo e fazê-lo voltar a ser útil.

Deixo claro que não terei nenhum envolvimento no projeto, só quero passar a tocha, mas quero fazer isso de uma forma que ajude a comunidade. Aguardo seus comentários.

Atenciosamente,
Rafael Rosa Fu

Os interessados em assumir o projeto podem deixar um comentário nesse post preenchendo corretamente o campo de e-mail (que não aparece para todos). O Rafael Rosa entrará em contato.

Ruby em todos os lugares e dispositivos

Na última quinta e sexta-feira aconteceu em São Paulo o RubyConf 2011. O RubyConf é sem sombra de dúvida a melhor conferência nacional sobre programação na atualidade.

As palestras, como sempre, foram acima da média. E esse ano a organização deu um passo além transmitindo online todas as apresentações. Se você não pôde estar presente é possível assistir ao evento inteiro no site da eventials, a empresa encarregada pela transmissão e gravação do evento. Segue o link: http://www.eventials.com/rubyconfbr

Eu também tive a oportunidade de palestrar, junto com meu amigo Luis Gustavo, e dessa vez o assunto foi sobre a nova máquina virtual Ruby compacta que estamos desenvolvendo aqui na Plano Bê. Para assistir a minha palestra, clique aqui. Os slides estão abaixo.

Eu já participei de muitas conferências sobre Ruby e outras linguagens, mas nenhuma se compara a RubyConf. Eu sei que o custo envolvendo a entrada do evento, viagem, alimentação e outros pode ser um pouco pesado, principalmente se você está iniciando na área, mas vale cada centavo.

Grok Podcast Extra - O que você achou?

O RubyConf Brasil 2011 está chegando e o Grok Podcast vai te ajudar a participar do evento sem gastar um centavo. Estamos sorteando até sexta-feira 4 ingressos para o evento.

Para participar é fácil. Basta clicar aqui ou publicar a mensagem abaixo no seu Twitter:

Participe da #RubyConfBR by #Locaweb, saiba mais sobre o evento em http://goo.gl/K5gHh e concorra a 4 ingressos /via #GrokPodcast

Aproveite que está no Twitter e me siga em @carlosbrando. ;)

Esse episódio introduz um formato diferente. Episódios extras, fora da cronologia normal e patrocinados por uma empresa ou grupo. Não queremos em hipótese alguma fazer simples propaganda, pelo contrário somente conteúdo relevante e que agregue conhecimento serão aprovados para esse formato. Porém o patrocinador pode sugerir temas que estejam relacionados ao seu negócio.

Esse primeiro episódio é apenas um piloto. O objetivo principal do Grok Podcast é informar e compartilhar conhecimento e não necessariamente lucrar com isso, porém com o crescimento de nossa audiência nossos gastos tem aumentado muito e esses anunciantes nos ajudam a manter o podcast no ar.

Porém, nós estamos interessados em saber o que você achou desse piloto. Se você é um ouvinte, deixe um comentário dizendo como se sente em relação a esses episódios extras e quais as suas expectativas.

O mesmo vale caso você tenha interesse em anunciar na série regular ou patrocinar um episódio extra. Nesse caso, entre em contato através da nossa página de contato e explicaremos em mais detalhes como isso funciona.