« Metisse (3D Desktop): Um novo conceito de interface gráfica | Main | Coleção de telas do JDS 2, da Sun »

terça-feira, 11 de janeiro de 2005

Tutorial da linguagem Ruby

O TaQ, que já foi colaborador aqui do BR-Linux no início do século, me enviou o link para o tutorial de Ruby que ele está desenvolvendo. Reproduzo trecho... (Ler na íntegra)

Publicado por brain às 14:59

Comentários dos leitores

(Termos de Uso)

» Comentário de TaQ () em 11/01 15:09

Ainda bem que o século mudou não faz muito tempo, senão ia se sentir um Matusalém. :-D

» Comentário de Guaracy Monteiro () em 11/01 17:05

Uma olhadinha rápida e me pareceu um ótimo material, mesmo para quem já conhece a linguagem. Para quem não conhece, o texto parece claro o suficiente para uma boa noção da linguagem.
Parabéns!

Um detalhe no item 3.2.1 (provavelmente um deslize do LaTeX):

onde se lê:
i4 = 3\_000\_000\_000

trocar por:
i4 = 3_000_000_000


» Comentário de TaQ () em 11/01 17:15

Ooooops, foi mesmo! :-p
Corrigido aqui, obrigado Guaracy! :-)

» Comentário de Ark () em 12/01 14:44

Até nunca entendi o pq... mas o povo de Ruby é muito receptivo (os próprios tutoriais são). Ao contrário de Python, onde você sempre tem que respirar 10 vezes ao tentar ler um tutorial.

» Comentário de Guaracy Monteiro () em 12/01 15:13

O povo é mesmo. Talvez por ser uma comunidade menor e, quem participa, é porque está realmente interessado e quer aprender ou ensinar. Quando as comunidades crescem muito, os maus exemplos se sobressaem.

Quanto aos tutoriais, quem sabe a 'receptividade' não seja algo intríseco da própria linguagem ;-)

Mas acho que tem tutorial bom sobre Python, inclusive o site do Osvaldo.

» Comentário de Osvaldo Santana Neto () em 12/01 18:26

Ark,

Se você me contar que que te destratou na comunidade Python me conta que a gente 'pega' ele :)

Mas recentemente na lista Python-Users rolou um 'stress' com um cara que perguntou algo que já tinha sido perguntado na lista umas 800 vezes (consequentemente estava no histórico da mesma).

Alguns defendem que é necessário ter paciência com os novatos e outros defendem que deve-se ensinar a eles como 'pescar' e não dar o 'peixe'. Poderiamos discutir sobre isso aqui o dia todo e não chegaríamos a lugar nenhum (logo, por favor não comecem a discutir isso).

Eu *pessoalmente* fico irritado com as pessoas que fazem perguntas já respondidas na lista que modero (PythonBrasil), mas não respondo mais a esses e-mails pois minha irritação costumava ficar impressa na mensagem. Deixo que outras pessoas que tenham mais paciência que eu ou até mesmo aos novatos que já fizeram essa pergunta respondam.

Para diminuir (mas não eliminar) esse problema publiquei a página: http://www.pythonbrasil.org/moin.cgi/AntesDePerguntar que tem algumas coisas básicas que um novato pode fazer ao invés de já sair perguntando algo na lista.

Antigamente, na Internet, os caras que não sabiam se comportar de forma agradável numa lista de discussão eram 'chutados' da lista muito mais facilmente do que hoje. Se isso ainda estivesse acontecendo é provavel que teríamos listas de discussão mais produtivas do que as que temos hoje.

Um problema que existe também é a queda da qualidade das discussões de uma lista quando o número de membros da mesma aumenta muito. Para verem isso é só acompanhar o histórico de algumas listas que hoje são muito grandes desde o início.

A comunidade Ruby vai passar por essa fase de crescimento que Python está passando agora (pois é uma linguagem realmente muito boa) e logo começarão a aparecer os novatos que irão repetir pela ducentésima vez as perguntas mais básicas do mundo mesmo que elas já estejam em um FAQ. É só uma questão de tempo.

Voltando ao tópico "Tutoriais": O PythonBrasil é um wiki "aberto" (agora é necessário se cadastrar pois estavamos sofrendo ataques) onde qualquer um pode contribuir com um tutorial novo ou alterando um que já exista. E requisitar tutoriais específicos também pode ser feito na lista de discussões.

Um adendo/correção ao Tutorial: Na página 7, 4o. bullet da seção "Recursos Ruby":
"Ruby é uma linguagem completa e pura orientada à objetos. Isso significa que todo dado em Ruby
é um objeto, não do jeito de Python e Perl, mas mais do jeito do SmallTalk: sem exceções. Por
exemplo, em Ruby, o número 1 é uma instância da classe Fixnum."

Em Python (a partir da versão 2.2) o número 1 também é uma instância (da classe int). Assim sendo isso aqui funciona da mesma forma que em Smalltalk e em Ruby (a diferença pra Smalltalk é que Python obedece às prioridades dos operadores enquanto que em Smalltalk eles são sempre avaliados na seqüência: operadores unários, binários e ternários da esquerda para a direita):

>>> 1 .__add__(1)
2

Tudo em Python é objeto inclusive classes e métodos. Diferente de Smalltalk não temos objetos do tipo bloco de código, mas os mesmos podem ser subsituidos por objetos do tipo callable (como métodos por exemplo).

PS. Existe precedência de operadores aritméticos em Ruby assim como em Python (e diferente de Smalltalk)?

» Comentário de Guaracy Monteiro () em 12/01 20:30

Os operadores aritméticos são tratados da forma convencional. Mesmo que 4 + 2 signifique na realidade 4.+(2), uma expressão como 4 + 2 * 8 = 20 (e não 48 como no Smalltalk). É claro que os parênteses podem alterar a precedência como em outras linguagens. (4 + 2) * 8 = 48.

Outrs funções matemáticas foram implementadas em um módulo separado para permitir cos(45), que é mais normal para nós, e não 45.cos (se bem que posso adotar a segunda forma).

» Comentário de TaQ () em 13/01 07:56

Oi!

Osvaldo, como disse naquela parte lá, apenas fiz uma tradução livre do que o Matz diz no "What's Ruby". :-)

Eu poderia até lhe dar razão e retirar o trecho do tutorial, mas acabaria descaracterizando o trecho traduzido, que pode ser encontrado (a URL está no PDF também) aqui:

http://www.ruby-lang.org/en/20020101.html

Segundo consta lá, foi atualizado no Natal de 2003, ok, tá meio antiguinho, mas você pode enviar um email para o Matz atentando para o fato. :-)

Ah, e discordo de você quanto ao fato das dúvidas repetitivas. Já tive experiências de perguntar coisas mais avançadas e levar uma espinafrada logo de cara. E não, não eram coisas idiotas e ridículas. Então, tem Pythonistas que são surtadinhos com qualquer coisa, e não só com coisas básicas. Não generalizando, mas ...

E concordo quando você diz que a comunidade de Ruby é menor que Python, e a tendência do crescimento pode levar à aquisição de pessoas com todo tipo de comportamento. Espero que durante esse crescimento possa acontecer algo do tipo que escutei numa historinha em um LP antigo do Barnabé:

_Me disseram que nessa cidade aqui só tem valente! É verdade? Cadê os valentes aqui? Quero ver!

_Que nada ... aqui não tem valente não ... quando aparece um a gente mata.

Ou seja, espero que sejam "filtrados" os valentões que vão (estão) aparecendo por aí. :-) Essa é uma vantagem de ter uma comunidade menor. :-)

» Comentário de Ark () em 13/01 11:02

Osvaldo: me refiro as pérolas que encontro nos tutoriais. Coisas do tipo "com python é impossível se fazer um programa ruim". Ou então ficar comparando tudo com Java (que a meu ver servem para coisas diferentes).

» Comentário de Osvaldo Santana Neto () em 13/01 12:56

Ark,

O comentário "com python é impossível se fazer um programa ruim" que vc viu em algum tutorial é extremamente infeliz. É muito fácil fazer programa ruim em Python porque ele te dá *muita* liberdade para desenvolver tua aplicação, ou seja, fazer coisa mal feita é fácil. Concordo que você poderia mandar um "alô" pro autor desse comentário ou me enviar em PVT o contato dele para que eu envie esse "alô" dizendo que o que ele disse é totalmente equivocado.

Com relação às comparações com Java: Eu assumo aqui a posição de um cara que faz isso bastante. Mas eu explico porque.

Java é uma plataforma fantástica para o desenvolvimento e Python também é. A linguagem Java é boa e é uma linguagem para uso geral. Python também é (só acho que Python tem algumas características que me agradam mais, mas isso não é pra ser discutido aqui num tópico sobre Ruby). Ambas servem para o mesmo propósito: Desenvolver aplicações. Não tem nada que você faça em Java que não faça em Python.

Eu uso Java para minhas comparações por um motivo muito simples: As pessoas conhecem Java e não conhecem Python, ou seja, eu uso Java para estabelecer um paralelo para essas pessoas compreenderem o que que Python é. Nada mais (houve um tempo no passado em que eu atacava Java, mas não faço isso mais. Mesmo a minha palestra no 5o. FISL "Matando o Java e mostrando o Python" não teve ataques à Java. Eu criei esse título apenas pra atrair a atenção dos usuários de Java para mostrar pra eles que existe Python, mas na palestra eu defendo Python em certas horas e Java em outras).

» Comentário de Osvaldo Santana Neto () em 13/01 13:06

Agora,

Vamos voltar ao tópico antes que o Augusto me dê um puxão de orelhas :)

Estão fazendo experiências de uma implementação Python em cima do Parrot (que é aquele projeto de desenvolvimento de uma VM unificada que partiu dos desenvolvedores do Perl) que se mostrou bastante interessante.

O pessoal de Ruby está pensando em algo do tipo? Ou seja, criar um compilador Ruby->Parrot?

Acho que se isso começar a surgir será o início do .NET-Livre. Imaginem uma única VM rodando código gerado à partir de Python, Perl e Ruby e fazendo intercâmbio de suas bibliotecas?

Parece ser uma experiência bem interessante e acabaria com as discussões entre Python vs. Perl, Python vs. Ruby e Perl vs. Ruby (existe essa?).

Afinal eu também sou simpático à Ruby e já participei da lista Ruby na época onde 90% dos tópicos estava em japonês :) e não gostaria de ver desavenças entre as comunidades Python e Ruby.

PS. TaQ, se possível, dê um aviso para o Matz sobre aquele tópico. Eu não vou fazer isso porque não conheço o cara, ele também não me conhece e eu inglês é miojônico (pior que macarrônico).

» Comentário de TaQ () em 13/01 13:38

Osvaldo,

Tem o Cardinal (http://cardinal.rubyforge.org/), mas confesso que ainda não dei uma olhada nele.

A idéia é muito boa (melhor que usar C# no Mono, em minha modesta opinião), pois iria dar uma tremenda flexibilidade. Só tem que fazer uma analogia esquecendo o .NET, vá. Deixa esse nome pra lá ehehe. :-)

Quanto à questão da pancadaria, mesmo que você jogue mais algumas linguagens lá no meio (Java! maldito Java! :-), esse papo de ficar um descendo a lenha no outro para mim não está com nada. Vamos escrever código, gente, e manter a boa vizinhança.
Eu acho VB horrível mas tenho grandes amigos que programam em VB, e não é por causa disso que vou ficar com birra pra cima deles. ;-)

Ah, mandei o email para ele. Também não o conheço, mas sei que ele não fala inglês tão bem assim, então fica empatado. :-)

» Comentário de TaQ () em 13/01 16:12

Osvaldo,

O Matz respondeu:

"Ruby is a complete, full, pure object oriented language: OOL. This means all data in Ruby is an object, not in the sense of Python or Perl, but in the sense of Smalltalk: no exceptions. Example: In Ruby, the number 1 is an instance of class Fixnum.

which means that everything in Python is an object, but their definition of object is different from that of Ruby or Smalltalk _at that time_.

Indeed since Python 2.2 even integers become instances of , but still that "type" is not really useful in OO manner, since

* "types" for built-in objects (like integers) are still treated by special classes different from ordinal classes.

* and more importantly, they have no useful methods (for example, int has only __newgetarg__ method, which is I think used by serialization).

In conclusion, the Python evangelist is partially right. Objects in Python becomes objects, even in a sense of Smalltalk, in theory. But in practice, they are not. Maybe in the future. I'm glad to rewrite when they are."

matz.

» Comentário de Guaracy Monteiro () em 13/01 16:16

Osvaldo e/ou

- Quanto a fazer um paralelo Java x Ruby/Python pode ser um caminho interessante se a audiência for Java. É o caso do Dave Thomas que tem uma sessão de Ruby no "No Fluff, Just Stuff". O resultado pode ser visto no blog do "Howard" do Jakarta Tapestry/HiveMind. http://howardlewisship.com/blog/2005/01/playing-with-ruby.html

- Apesar de existir o Cardinal, o pessoal ligado ao desenvolvimento não pretende usar o Parrot. Existem alguns detalhes da linguagem (atuais e futuros) que serão de difícil implementação. Está sendo criada uma VM específica para Ruby que deverá ser incluído na versão 2 do Ruby. Não oficialmente, existem ainda dois para Java e dois para .NET.

- Discutir sobre software livre é uma droga. A dinâmica é muito grande. Basta ficar um ano sem usar uma ferramenta e já fica difícil discutir sobre ela. O máximo que podemos fazer é perguntar se já foi implementado e ficar aguardando a resposta. Geralmente sim.

O formulário de comentários está desativado devido à mudança de sistema de gerenciamento de conteúdo.