Ruby e Python são duas grandes linguagens de programação em termos de interpretação e tipagem dinâmica. Pode ler sobre as suas aplicações, popularidade e comunidade numa das entradas deste blogue. Estas linguagens têm muitas coisas em comum, mas também muitas diferenças. Neste artigo, vou apresentar algumas delas.
Semelhanças
Uma vez que estas linguagens podem ser incluídas na mesma categoria de linguagens interpretadas dinamicamente tipadas, não há dúvida de que são semelhantes.
Tipagem dinâmica
Ambos Python e Rubi são linguagens tipadas dinamicamente. Como resultado, o programador não tem de especificar o tipo de variáveis enquanto escreve o ficheiro código. O seu tipo é determinado enquanto o programa está a ser executado e pode mudar. O tipo de uma variável é derivado do valor armazenado na mesma. O código seguinte será executado corretamente nestas linguagens:
variável = 1
variável += 2.5
variável = "amostra de cadeia
variável = [2, 3.5, 'sample string']
Sintaxe pura
Isto está relacionado com o ponto anterior, entre outros. Devido ao facto de não ser necessário declarar tipos, terminar as declarações com um ponto e vírgula, e também ao facto de serem linguagens de script, tanto a escrita como a leitura são fáceis. Um código bem escrito será legível mesmo para pessoas que não tenham tido qualquer contacto prévio com estas linguagens.
Dispõem de intérpretes de consola interactivos
Quando se pretende efetuar uma operação simples ou testar um código, não é necessário criar um ficheiro e executar o código utilizando um comando especial. Tanto o Ruby como o Python têm interpretadores de consola interactivos (REPL). Para o Python, podemos executar esse interpretador com o comando pitão (oupython3), enquanto que para Ruby poderia ser, por exemplo, irb:
$ irb
2.5.8 :001 > resultado = 2 + 1
=> 3
2.5.8 :002 > resultado += 3.5
=> 6.5
Diferenças
Como são diferentes linguagens de programaçãoÉ claro que têm de ter diferenças (eu sei, que afirmação reveladora). No caso do Python e do Ruby, essas diferenças são numerosas. Vou descrever algumas das mais significativas na minha opinião.
Travessões
A indentação é muito importante no Python. Todos os blocos de código são definidos por indentação. É importante que cada linha de um determinado bloco tenha a mesma indentação. Caso contrário, quando tentarmos executar o código, receberemos IndentationError. O Ruby adopta uma abordagem diferente. Aqui, o bloco de código é limitado por palavras-chave. Distinguimos a palavra inicial (e.g.begin, if, class, def) e a palavra final fim. Não importa como o código é indentado dentro do bloco de código.
Herança
Uma das caraterísticas básicas da programação orientada para objectos. Nas mãos certas, pode fazer maravilhas. O Python suporta herança multi-base:
example.py
class ClassA:
def callA(self):
print('callA')
class ClassB:
def callB(self):
print('callB')
classe ClassAB(ClassA, ClassB):
pass
classe_inst = ClasseAB()
class_inst.callA()
class_inst.callB()
Como resultado, obtemos:
$ python3 example.py
chamadaA
chamadaB
O Ruby apenas suporta herança de base única usando o operador < por defeito. No entanto, é possível simular a herança multi-base usando módulos:
exemplo.rb
classe ClassA
def calla
puts 'calla'
fim
fim
módulo ModuleB
def callb
puts 'callb'
end
fim
classe ClassAB < ClassA
include MóduloB
end
classinst = ClassAB.new
classinst.calla
classinst.call_b
O que dá nós:
$ ruby example.rb
chamada_a
chamada_b
incluir é apenas um dos mixins disponíveis em Ruby. Os mixins são uma forma de adicionar funcionalidades extra às classes. Existem três mixins em Ruby.
Incluir
Quando chamamos incluir na definição da classe, o módulo incluído torna-se o antepassado direto desta classe. Isso significa que todos os métodos do módulo se tornam métodos de instância desta classe. Podemos sobrescrevê-los na classe e também chamar o método original (definido no módulo) usando super palavra-chave.
exemplo.rb
módulo ModuleA
def print_something
puts 'Mensagem do módulo'
end
fim
classe ClasseB
inclui ModuleA
def print_something
puts 'Mensagem da classe'
super
end
fim
ClassB.new.print_something
Resultado:
$ ruby example.rb
Mensagem da classe
Mensagem do módulo
Anexar
Funciona quase como incluirmas o módulo prefixado torna-se descendente direto da classe. Isso significa que não podemos substituir o método do módulo na classe, mas o método no módulo pode chamar o método da classe usandosuper palavra-chave.
exemplo.rb
módulo ModuleA
def print_something
puts 'Mensagem do módulo'
super
fim
fim
classe ClassB
prepend ModuleA
def print_something
puts 'Mensagem da turma'
end
fim
ClassB.new.print_something
Resultado:
$ ruby example.rb
Mensagem do módulo
Mensagem da classe
Alargar
Funciona de forma semelhante ao include, exceto que os métodos definidos no módulo tornam-se métodos de classe da classe.
Resultado:
$ ruby example.rb Mensagem do módulo
Funções e blocos
Python tem funções. O Ruby suporta apenas métodos. O que é que isso implica? Entre outras coisas, o Python pode guardar uma função numa variável e passá-la como argumento para outra função. Em Ruby, não podemos fazer isso tão facilmente. Isto também está relacionado com os parêntesis. Dada uma função sem argumentos no Python, ou com argumentos por defeito, se usarmos o seu nome sem parênteses, a função será devolvida. Apenas a adição dos parênteses leva à sua execução. Em Ruby, podemos chamar funções sem parênteses:
example.py
def função_interior():
print('Função interna')
def wrapper_function(função):
print('Função envolvente')
# function é uma variável que contém o objeto função
function() # a função interna é chamada aqui
wrapperfunction(innerfunction)
Resultado:
$ python3 example.py
Função envolvente
Função interna
Em Ruby:
exemplo.rb
def função_interior
puts 'Função interna'
fim
def wrapper_function(função)
puts 'Função de proteção'
função
fim
wrapperfunction(innerfunction) # A inner_function é chamada aqui
Resultado:
$ ruby example.rb
Função interna
Função de cobertura
Claro que, neste caso, pode fazer alguns truques em Ruby para conseguir o efeito desejado. Primeiro, podemos usar o objeto Proc:
exemplo.rb
def função_interior
puts 'Função interna'
fim
def wrapper_function(função)
puts 'Função envolvente'
function.call
fim
func = Proc.new { innerfunction }
wrapperfunction(func)
Resultado:
$ ruby example.rb
Função de invólucro
Função interna
A segunda abordagem é a utilização de blocos:
example.rbdef função_interior
puts 'Função interna'
fim
def funcao_embalagem
puts 'Função de proteção'
yield
fim
wrapperfunction do
função interna
fim
Resultado:
$ ruby example.rb
Função de invólucro
Função interna
Compreensão da lista
Esta é uma caraterística muito útil do Python. Consiste em criar uma lista a partir de outra lista. Vamos supor que temos uma tarefa deste género: dada uma lista de números, fazer uma lista de quadrados de números ímpares. No Python, usamos a compreensão de listas:
números = [1, 3, 4, 7, 8, 12, 15]
resultado = [num*num for num in numbers if num % 2]
A vantagem é que só temos duas listas na memória.
Em Ruby, as coisas são um pouco diferentes. Existem várias formas de resolver esta tarefa. Vou apresentar a mais legível delas:
números = [1, 3, 4, 7, 8, 12, 15]
resultado = []
números.each { |num| resultado << num * num if num.odd? }
Como podemos ver, pode ser feito, mas não tão elegante como no Python.
Todas as classes são mutáveis
Em Ruby, todas as classes são mutáveis. O que é que isso significa? Podemos adicionar ou sobrescrever métodos de todas as classes, mesmo as incorporadas. Suponhamos que queremos um método que mude todas as letras an para b na string. Podemos fazê-lo de uma forma simples:
exemplo.rb
classe String
def atob!
self.gsub!(/a/, 'b')
end
fim
string = 'Exemplo de string com muitas letras a'
coloca string
string.atob!
puts string
Resultado:
$ ruby example.rb
Exemplo de string com muitas letras a
Exemplo de string com muitas letras b
Resumo
Desenvolvimento Web tem sido um domínio dinâmico que adopta e molda continuamente vários linguagens de programação para satisfazer as suas necessidades. Duas escolhas populares nesta área incluem o Linguagem de programação Python e Ruby. Ambos provaram o seu valor em criar aplicações web e outras formas de software, cada uma com as suas vantagens e desvantagens únicas.
Python é um linguagem de programação de alto nível reverenciado pela sua simplicidade e legibilidade do códigouma caraterística que muitas vezes atrai os programadores principiantes. O Linguagem de programação Python é versátil e pode ser utilizado para uma variedade de tarefas. Este linguagem de programação de uso geral é frequentemente utilizado em domínios como aprendizagem automática, grandes volumes de dados e, nomeadamente, desenvolvimento web. Um amplo comunidade de programadores Python contribui para o seu rico ecossistema de bibliotecas e estruturas, melhorando a sua adequação para criar aplicações web. Django, Flask e Pyramid estão entre os vários Python estruturas web alavancado por programadores web em todo o mundo.
Por outro lado, Ruby, outro linguagem de programação de alto nível e de uso geralA sua flexibilidade e expressividade fazem-na brilhar. Este linguagem de programação orientada para os objectos é a espinha dorsal de muitos aplicações web. O encanto do Ruby reside na sua capacidade de facilitar desenvolvimento web através do Carris enquadramento, uma ferramenta poderosa para criar aplicações web rapidamente.
Ruby, embora menos popular do que Python, conta com uma equipa ativa e dedicada Comunidade Ruby que desenvolve e mantém continuamente um conjunto de bibliotecas e ferramentas, enriquecendo assim a experiência de programadores web utilizando esta língua. Como linguagem orientada para os objectosO Ruby é apreciado pela sua elegância e pelo código limpo e legível que produz, tornando-o uma escolha adequada tanto para pequenas como para grandes escalas aplicações web.
Python e Ruby, como linguagens de programação orientadas para os objectospartilham muitas semelhanças. Também apoiam programação funcionaloferecendo aos programadores vários estilos de código. Código Pythoné particularmente apreciada pela sua sintaxe simples, que sublinha a ênfase da linguagem na simplicidade e legibilidade.
Cada língua tem os seus pontos fortes; Python's versatilidade e grande comunidade fazem dele uma excelente ferramenta para várias tarefas, enquanto a expressividade do Ruby e a Estrutura Rails torna-o um forte candidato a aplicação web desenvolvimento. São as necessidades e preferências únicas de programadores web que determinará qual língua melhor serve os seus projeto.
No domínio da sistemas operativosambas as línguas apresentam um nível impressionante de portabilidade, o que reforça a sua adequação a uma multiplicidade de tarefas, entre as quais desenvolvimento web. Por conseguinte, é um desafio declarar um "vencedor" definitivo neste duelo.
Enquanto o Linguagem de programação Python tem um alcance mais vasto e maior comunidadeAs capacidades do Ruby não devem ser subestimadas. Para apreciar plenamente essas linguagens, é preciso mergulhar nelas, entender suas complexidades e aplicá-las onde elas mais brilham. Quer esteja a criar aplicações web com Python ou Ruby, cada língua oferece uma plataforma robusta para fornecer serviços de alta qualidade aplicações web. Ruby, embora menos conhecido, merece certamente o seu devido apreço no mundo da linguagens de programação.