Posts arquivos para fevereiro, 2009

13fev2009

As aventuras de programador em busca do Ruby – Parte 1

(0) comentários

Já faz um tempo que não posto nada, aproveitei o tempo vago nos últimos dias para aprender um nova linguagem de programação –algo que me dá uma grande satisfação–.

Baixei vários livros de diversas linguagens, mas os papos de corredor me levaram a escolher Ruby.

Apesar de programar em PHP por alguns anos, já estava desacostumado com linguagens Dinamicamente Tipadas, gosto muito de Java, estou até devendo escrever algo aqui no blog, mas com certeza ele me acostumou muito mal!!!

Pois bem, vamos parar de história e começar a diversão!

A escolha do livro O Ruby

Essa parte foi bem difícil, porém, não menos interessante… Iniciei a leitura com o livro indicado por um amigo de trabalho o bem recomendado The Ruby Way, porém achei a leitura um tanto densa e longa (888 páginas assustam), então parti para um livro mais barato e menor, porém, não menos completo e interessante The Ruby Programming Language. O livro é ótimo e um dos seus autores é nada mais nada menos que o criador do Ruby Yukihiro Matsumoto – Matz –acho que o cara manja um pouquinho!–.
A leitura deste livro é bem tranqüila e eu estou gostando muito, recomendo, e enquanto for lendo vou compartilhar os ensinamentos adquiridos aqui no site, assim eu fixo o aprendizado e compartilho com a comunidade!
Vou deixar bem claro que não se trata de uma tradução, poderia talvez chamar isto de um “resumo público”, mas ainda assim, recomendo que comprem e leiam o livro.
Vou dividir a estrutura igual ao livro, porém vou iniciar a série de posts a partir do capitulo 2. Motivo? Quero que você tenha a mesma surpresa que eu tive quando ler o capitulo 1!

Estrutura e Execução de Programa Ruby

Estrutura Léxica

Comentários

# isto é um comentário de uma linha inteira
puts "Alan" # isto é um comentário
regex = /#[A-Za-z0-9] isto eh um expressão regular/ # isto é outro comentário

Comentários de múltiplas linhas deve ser feito assim:

#
# Desta forma é possível fazer um comentário de várias linhas
# No Ruby não há uma forma de comentar semelhante a essa no Java /* */
#

Documentos Embutidos

No Ruby há outra forma de inserir comentários multi linhas. Basta iniciar o bloco comentado por =begin e termina-lo com =end. Tudo que estiver entre =begin e =end será ignorado pelo interpretador, mas lembre-se, deve ter no minimo um espaço em branco após o =begin.

=begin isto é um comentário multi linha
tudo que esta aqui será ignorado pelo o interpretador.
=end

Literais

No Ruby há valores literais, aqueles que são inseridos diretamente no código, podem ser uma String, um número inteiro, ponto flutuante, expressão regular, etc., como o exemplo a seguir:

1         # inteiro
1.0       # ponto flutuante
"texto"   # string
/regex/   # expressão pessoal

Operadores

Há vários operadores no Ruby, porém vou falar mais sobre eles mais na frente (estão no capitulo 4 do livro rsrs), tem várias informações interessantes para falar sobre eles depois.

Identificadores

Identificadores são simplesmente um nome no Ruby e são usados para representar nomes de variáveis, métodos, Módulos, Classes e outros. Podem ser escritos por letras, números e underscore, porém eles não podem iniciar com um número.

Identificadores não podem iniciar por operadores exceto +, – ,|| e outros que serão descritos.

Os identificadores que iniciarem com uma letra maiúscula serão considerados constantes (passível que gerar um alerta, caso houver tentativa de alteração de seu valor). Classes e Módulos devem iniciar por uma letra maiúscula.

Ex:

a
a2
a_2
a2b
_var
PI                   # constante
class Pessoa # define a classe pessoa
end

O ruby é uma linguagem case sensitive, o identificador NOME é diferente de nome ou NoMe, lembre-se disso.

Outros usos de identificadores

No Ruby alguns identificadores tem um valor especial e são usados no inicio e no fim dos identificadores, vou mostrar essa parte com exemplos:

$var_global         # como no Perl, o Ruby define variáveis globais com $
@var_instance       # atributos de objeto são definidos com @ na frente do identificador
@@var_class         # atributos de escopo de classe recebem @@ na frente
obj.respond_to?     # métodos que retorno um boolean por convenção recebem um ? no final do identificador
"nome".upcase!      # métodos que devem ser usados com cuidado recebem um ! nome final
pessoa.nome="josé"  # métodos de atribuição deveria receber = no final... vamos falar mais disso depois

Palavras Chave

As seguintes palavras são chaves e tem um significado especial para Ruby.

__LINE__      case         ensure       not          then
__ENCODING__  class        false        or           true
__FILE__      def          for          redo         undef
BEGIN         defined?     if           rescue       unless
END           do           in           retry        until
alias         else         module       return       when
and           elsif        next         self         while
begin         end          nil          super        yield
break

E mais essas 3 que quando aparecem no inicio da linha tem um significado especial para o parser.

=begin   =end   __END__

Apesar de serem palavras chave, se estas palavras forem precedidas de @, @@, $ ou se usadas em nomes de métodos o código será interpretado sem erro (isto se deve a flexibilidade do interpretador do Ruby) porém o uso dessas palavras irá gerar um código de difícil interpretação, não acha?

Alguns comportamentos e características do Ruby estão ligados aos métodos de Kernel, Object, Module e Class. Como boa prática seria interessante tratar seus métodos como palavras reservadas.

# Estes métodos parecem palavras chaves ou reservadas
at_exit        catch          private        require
attr           include        proc           throw
attr_accessor  lambda         protected
attr_reader    load           public
attr_writer    loop           raise

# Estes são normalmente usados como funções globais
Array          chomp!         gsub!          select
Float          chop           iterator?      sleep
Integer        chop!          load           split
String         eval           open           sprintf
URI            exec           p              srand
abort          exit           print          sub
autoload       exit!          printf         sub!
autoload?      fail           putc           syscall
binding        fork           puts           system
block_given?   format         rand           test
callcc         getc           readline       trap
caller         gets           readlines      warn
chomp          gsub           scan

# E estes são usado  como métodos de Object
allocate       freeze         kind_of?       superclass
clone          frozen?        method         taint
display        hash           methods        tainted?
dup            id             new            to_a
enum_for       inherited      nil?           to_enum
eql?           inspect        object_id      to_s
equal?         instance_of?   respond_to?    untaint
extend         is_a?          send

Espaços em branco

A sintaxe do código Ruby é bem flexível, porém devemos ter alguns cuidados com isso. O uso de espaços em branco pode mudar a interpretação do código e causar resultados inesperados.
Ex:

avalia(3+1)+1 # executa o método avalia e adiciona 1
 

Outro exemplo:

# O Interpretador assume que o "(" (parenteses) foi omitido e intepreta (3+1)+1 e
# passa o resultado como argumento para o método avalia.
avalia (3+1)+1
 

Existem outras situação que serão mostradas nos post seguintes.

Estrutura Sintática

Neste capitulo do livro é introduzido temas relacionados a simples expressões a até complexos módulos.
No Ruby a unidade básica é a expressão, desde um valor literal que é uma expressão primária ou expressões mais complexas que usam palavras chaves como nil, self, true, false.

[:a,:b,:c]                                   # array de símbolos
["nome" => "José", "endereco" => "Rua Amazonas"]  # declaração literal de um hash
5                  # expressão primária
x = x+1    # atribuição

Assim como em outras linguagens de programação, no Ruby composições de declarações formam declarações (statement) conforme a seguir:

if x > 1
   puts "#{x} é maior que 1"
else
   puts "#{x} é menor ou igual a 1"
end

Blocos

Há duas maneiras de criar blocos no Ruby, e esta forma de construção é extremamente prático.

10.times { puts "Olá mundo 10 vezes, só para confirmar!" }

1.upto 10 do |n| puts "o número atual é #{n}" end

Mais informações sobre os blocos serão mostradas nos próximos posts.

Bem então é isso, a aventura não acabou, muito pelo contrário, ela está apenas iniciando.

Primeiras impressões

As primeiras impressões com o Ruby foram as melhores possíveis, acho que de todas as linguagens que aprendi essa foi a me mais me identifiquei até hoje, superou até o Python o qual eu não brinco já há algum tempo (tenho um colega que discordará dessa frase).
Pois bem, só posso concluir esse post dizendo, você deveria experimentar o ruby agora!!!


4fev2009

Rfactor: Ruby Refactoring for your loved editor

(0) comentários

I know we all love Ruby, and doesn’t care that much about not having auto completion/IntelliSense available.

I don’t care that much about auto completion, when coding in Ruby, myself. What I really like in Java IDEs is their refactoring support. Eclipse and IntelliJ IDEA are simply awesome in this space for Java. We still have ReSharper for Visual Studio and others, targeting other languages. Ruby has NetBeans, Aptana RadRails, RubyMine and TurboRuby/3rdRail doing a great job in this area.

But, I have this feeling that most of Ruby developers do not use IDEs (including myself). We are using good text editors, such as TextMate, Vim, Emacs and GEdit. They are good enough. Why would I need something else?

I have to admit. I really miss some refactorings while programming in Ruby. Particularly, the lack of “Extract Method” and “Extract Variable” bothers me. They aren’t even complicated, why hasn’t someone already implemented them?

So, I would like to introduce Rfactor. It is a Ruby gem, which aims to provide common and simple refactorings for Ruby code. RubyParser from Ryan Davis is being used to analyze and manipulate the source code AST, in the form of Sexps.

In theory, we should be able to use Rfactor to power any editor, adding refactoring capabilities to it. I’m targeting TextMate, but I would love to see contributions for others. The TextMate Bundle is hosted on github:

Rfactor TextMate Bundle, with installation instructions

This very first release has support only for basic “Extract Method”: inside methods and without trying to guess the method parameters and return.

Stay in touch, there is much more coming!


Posted in bundle, editor, intellij, rails, refactor, refactoring, ruby, textmate, Uncategorized Tagged: ast, bundle, code, coding, editor, emacs, gedit, parsetree, rails, refactor, refactoring, ruby, ruby_parser, textmate, vi, vim

Switch to our mobile site