Há muitas discussões sobre Python x Ruby, e todas as considero completamente inúteis, porque todas elas se voltam para o motivo pelo qual o recurso X é péssimo na linguagem Y ou que afirma que a linguagem Y não possui X, embora, na verdade, exista. Também sei exatamente por que prefiro o Python, mas isso também é subjetivo e não ajudaria ninguém a escolher, pois eles podem não ter o mesmo gosto em desenvolvimento que eu.
Seria, portanto, interessante listar as diferenças objetivamente. Portanto, nenhuma "lambda do Python é uma merda". Em vez disso, explique o que as lambdas de Ruby podem fazer e as de Python. Sem subjetividade. Código de exemplo é bom!
Não tenha várias diferenças em uma resposta, por favor. E vote nas que você sabe que estão corretas e as que você conhece estão incorretas (ou são subjetivas). Além disso, as diferenças na sintaxe não são interessantes. Sabemos que Python faz com indentação o que Ruby faz com colchetes e termina, e que @ é chamado self em Python.
ATUALIZAÇÃO: Agora é um wiki da comunidade, para que possamos adicionar grandes diferenças aqui.
Ruby tem uma referência de classe no corpo da classe
No Ruby, você tem uma referência à classe (auto) já no corpo da classe. No Python, você não tem uma referência à classe até que a construção da classe seja concluída.
Um exemplo:
class Kaka
puts self
end
self neste caso é a classe e esse código imprimiria "Kaka". Não há como imprimir o nome da classe ou, de outras formas, acessar a classe a partir do corpo da definição de classe no Python (fora das definições de método).
Todas as classes são mutáveis em Ruby
Isso permite que você desenvolva extensões para classes principais. Aqui está um exemplo de uma extensão de trilhos:
class String
def starts_with?(other)
head = self[0, other.length]
head == other
end
end
Python (imagine que não havia ''.startswith
método):
def starts_with(s, prefix):
return s[:len(prefix)] == prefix
Você pode usá-lo em qualquer sequência (não apenas em seqüências de caracteres). Para usá-lo, você deve importá-lo explicitamente , por exemplo from some_module import starts_with
,.
Ruby possui recursos de script semelhantes ao Perl
O Ruby possui regexps de primeira classe, variáveis-$, o loop de entrada de linha por linha do awk / perl e outros recursos que o tornam mais adequado para escrever pequenos scripts de shell que movem arquivos de texto ou agem como código de cola para outros programas.
Ruby tem continuações de primeira classe
Graças à declaração callcc. No Python, você pode criar continuações usando várias técnicas, mas não há suporte incorporado à linguagem.
Ruby tem blocos
Com a instrução "do", você pode criar uma função anônima de várias linhas no Ruby, que será passada como argumento para o método na frente do do e chamada a partir daí. Em Python, você faria isso passando um método ou com geradores.
Rubi:
amethod { |here|
many=lines+of+code
goes(here)
}
Python (blocos Ruby correspondem a diferentes construções em Python):
with amethod() as here: # `amethod() is a context manager
many=lines+of+code
goes(here)
Ou
for here in amethod(): # `amethod()` is an iterable
many=lines+of+code
goes(here)
Ou
def function(here):
many=lines+of+code
goes(here)
amethod(function) # `function` is a callback
Curiosamente, a declaração de conveniência no Ruby para chamar um bloco é chamada "yield", que no Python criará um gerador.
Rubi:
def themethod
yield 5
end
themethod do |foo|
puts foo
end
Pitão:
def themethod():
yield 5
for foo in themethod():
print foo
Embora os princípios sejam diferentes, o resultado é surpreendentemente semelhante.
O Ruby suporta programação de estilo funcional (semelhante a um tubo) com mais facilidade
myList.map(&:description).reject(&:empty?).join("\n")
Pitão:
descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions))
O Python possui geradores internos (que são usados como blocos Ruby, conforme observado acima)
Python tem suporte para geradores na linguagem. No Ruby 1.8, você pode usar o módulo gerador, que usa continuações para criar um gerador a partir de um bloco. Ou você pode simplesmente usar um bloco / proc / lambda! Além disso, no Ruby 1.9, as fibras são e podem ser usadas como geradores, e a classe Enumerator é um gerador interno .
docs.python.org tem este exemplo de gerador:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
Compare isso com os exemplos de blocos acima.
Python possui manipulação de espaço de nome flexível
No Ruby, quando você importa um arquivo require
, todas as coisas definidas nesse arquivo acabam no seu espaço de nome global. Isso causa poluição no espaço para nome. A solução para isso são os módulos Rubys. Mas se você criar um espaço para nome com um módulo, precisará usá-lo para acessar as classes contidas.
No Python, o arquivo é um módulo e você pode importar seus nomes contidos from themodule import *
, poluindo o espaço para nome, se desejar. Mas você também pode importar apenas os nomes selecionados from themodule import aname, another
ou simplesmente import themodule
acessar os nomes com themodule.aname
. Se você deseja mais níveis no seu espaço para nome, pode ter pacotes, que são diretórios com módulos e um __init__.py
arquivo.
Python tem docstrings
Docstrings são strings anexadas a módulos, funções e métodos e podem ser introspectivas em tempo de execução. Isso ajuda a criar itens como o comando help e a documentação automática.
def frobnicate(bar):
"""frobnicate takes a bar and frobnicates it
>>> bar = Bar()
>>> bar.is_frobnicated()
False
>>> frobnicate(bar)
>>> bar.is_frobnicated()
True
"""
Os equivalentes do Ruby são semelhantes aos javadocs e localizados acima do método, e não dentro dele. Eles podem ser recuperados em tempo de execução a partir dos arquivos usando o Método 1.9 do código # source_location exemplo use
Python tem herança múltipla
O Ruby não ("de propósito" - consulte o site do Ruby, veja aqui como é feito no Ruby ). Ele reutiliza o conceito de módulo como um tipo de classes abstratas.
Python tem compreensão de lista / dict
Pitão:
res = [x*x for x in range(1, 10)]
Rubi:
res = (0..9).map { |x| x * x }
Pitão:
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Rubi:
p = proc { |x| x * x }
(0..9).map(&p)
Python 2.7+ :
>>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}
{1: '4', 3: '16'}
Rubi:
>> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]
=> {1=>"4", 3=>"16"}
Python tem decoradores
Coisas semelhantes aos decoradores também podem ser criadas no Ruby, e também se pode argumentar que elas não são tão necessárias quanto no Python.
Diferenças de sintaxe
Ruby requer "end" ou "}" para fechar todos os seus escopos, enquanto o Python usa apenas espaço em branco. Houve tentativas recentes em Ruby de permitir apenas recuo de espaço em branco http://github.com/michaeledgar/seamless
Respostas:
Ruby tem os conceitos de blocos , que são essencialmente açúcar sintático em torno de uma seção do código; eles são uma maneira de criar fechamentos e passá-los para outro método que pode ou não usar o bloco. Um bloco pode ser chamado posteriormente através de uma
yield
instrução.Por exemplo, uma definição simples de um
each
métodoArray
pode ser algo como:Então você pode invocar isso assim:
O Python possui funções / closures / lambdas anônimas, mas não possui blocos porque está faltando um pouco do açúcar sintático útil. No entanto, há pelo menos uma maneira de obtê-lo de maneira ad-hoc. Veja, por exemplo, aqui .
fonte
Exemplo de Python
Funções são variáveis de primeira classe no Python. Você pode declarar uma função, passá-la como um objeto e substituí-la:
Esse é um recurso fundamental das linguagens de script modernas. JavaScript e Lua também fazem isso. Ruby não trata as funções dessa maneira; nomear uma função chama isso.
Obviamente, existem maneiras de fazer essas coisas no Ruby, mas elas não são operações de primeira classe. Por exemplo, você pode agrupar uma função com Proc.new para tratá-la como uma variável - mas não será mais uma função; é um objeto com um método "call".
As funções do Ruby não são objetos de primeira classe
Funções Ruby não são objetos de primeira classe. As funções devem estar envolvidas em um objeto para distribuí-las; o objeto resultante não pode ser tratado como uma função. As funções não podem ser atribuídas de maneira de primeira classe; em vez disso, uma função em seu objeto contêiner deve ser chamada para modificá-los.
fonte
x = y
não por chamadaself.class.send(:define_method, :func, method(:func2))
. Seu "contra-exemplo" mostra como as funções de Ruby não são de primeira classe. Se você não concordar, fique à vontade para postar sua própria resposta; Não coloque sua confusão na minha.def ... end
em ruby não são funções. Eles são métodos (da maneira que você os definiuKernel
). Os métodos podem ser desvinculados (usando o#method
método), que são objetos. A coisa mais próxima que o ruby tem das funções sãoProc
instâncias, que também são objetos e podem ser passadas ou invocadas. Ele também possui uma sintaxe especial para passar um único retornoProc
de chamada para um método, como John Feminella discute em sua resposta .UnboundMethod
pode ser uma PITA, também.Em última análise, todas as respostas serão subjetivas em algum nível, e as respostas postadas até agora provam que você não pode apontar para nenhum recurso que não seja viável no outro idioma de uma maneira igualmente agradável (se não semelhante) , pois os dois idiomas são muito concisos e expressivos.
Eu gosto da sintaxe do Python. No entanto, você precisa se aprofundar um pouco mais que a sintaxe para encontrar a verdadeira beleza do Ruby. Há uma beleza zen na consistência de Ruby. Embora nenhum exemplo trivial possa explicar isso completamente, tentarei criar um aqui apenas para explicar o que quero dizer.
Inverta as palavras nesta sequência:
Quando você pensa em como faria, faria o seguinte:
Em Ruby, você faria o seguinte:
Exatamente quando você pensa sobre isso, na mesma sequência, uma chamada de método após a outra.
Em python, seria mais parecido com isto:
Não é difícil de entender, mas não tem o mesmo fluxo. O sujeito (frase) está enterrado no meio. As operações são uma mistura de funções e métodos de objeto. Este é um exemplo trivial, mas descobrimos muitos exemplos diferentes ao realmente trabalhar e entender o Ruby, especialmente em tarefas não triviais.
fonte
Python tem uma mentalidade de "somos todos adultos aqui". Assim, você descobrirá que Ruby tem coisas como constantes, enquanto Python não (embora as constantes de Ruby apenas gerem um aviso). O modo de pensar do Python é que, se você deseja tornar algo constante, deve colocar os nomes das variáveis em maiúsculas e não alterá-los.
Por exemplo, Ruby:
Pitão:
fonte
Você pode importar apenas funções específicas de um módulo no Python. No Ruby, você importa toda a lista de métodos. Você pode "não importar" eles no Ruby, mas não é disso que se trata.
EDITAR:
vamos pegar este módulo Ruby:
se você incluí-lo no seu código:
você verá que ambos method1 e method2 foram adicionados ao seu namespace. Você não pode importar apenas o método1 . Você importa os dois ou não os importa. No Python, você pode importar apenas os métodos de sua escolha. Se isso tivesse um nome, talvez fosse chamado de importação seletiva?
fonte
import bla; bla.foo()
em Ruby?module
na verdade é um pouco impróprio. Os módulos são basicamente aulas sans onew
,allocate
métodos. Eles funcionam melhor como uma maneira de compartilhar código por classe / objeto, não como mecanismo para particionar bibliotecas ou para compartilhar código entre programas.No site da Ruby :
Similaridades Tal como acontece com Python, em Ruby, ...
Diferenças Ao contrário do Python, no Ruby, ...
fonte
O que Ruby tem sobre Python são seus recursos de linguagem de script. Linguagem de script nesse contexto que significa ser usada para "código de cola" em scripts de shell e manipulação geral de texto.
Estes são principalmente compartilhados com o Perl. Expressões regulares internas de primeira classe, $ -Variables, opções úteis de linha de comando, como Perl (-a, -e) etc.
Juntamente com sua sintaxe concisa, porém epxressiva, é perfeita para esse tipo de tarefa.
O Python para mim é mais uma linguagem de negócios de tipo dinâmico, muito fácil de aprender e com uma sintaxe pura. Não é tão "legal" quanto Ruby, mas limpo. O que Python tem sobre Ruby para mim é o grande número de ligações para outras bibliotecas. Ligações ao Qt e outras bibliotecas da GUI, muitas bibliotecas de suporte a jogos e and and. Ruby tem muito menos. Embora as ligações muito usadas, por exemplo, os bancos de dados, sejam de boa qualidade, eu achei as bibliotecas de nicho com melhor suporte no Python, mesmo que para a mesma biblioteca também exista uma ligação Ruby.
Então, eu diria que ambas as línguas têm seu uso e é a tarefa que define qual delas usar. Ambos são fáceis de aprender. Eu os uso lado a lado. Ruby para scripts e Python para aplicativos independentes.
fonte
Eu não acho que "Ruby tem X e Python não, enquanto Python tem Y e Ruby não" é a maneira mais útil de ver isso. São idiomas bastante semelhantes, com muitas habilidades compartilhadas.
Em grande parte, a diferença é o que a linguagem torna elegante e legível. Para usar um exemplo que você criou, ambos teoricamente têm lambdas, mas os programadores de Python tendem a evitá-los, e as construções feitas com eles não parecem tão legíveis ou idiomáticas quanto em Ruby. Portanto, em Python, um bom programador desejará seguir uma rota diferente para resolver o problema do que em Ruby, apenas porque na verdade é a melhor maneira de fazê-lo.
fonte
for format in respond_to()
. Orespond_to
método não retorna nada significativo - ele simplesmente responde à solicitação HTTP atual. Odo
inrespond_to do
é o começo de um bloco. Nesse bloco, falamos com um objeto temporário (rotuladoformat
neste exemplo) que implementa uma DSL muito básica para responder a uma solicitação HTTP.Gostaria de sugerir uma variante da pergunta original: "O que Ruby tem que Python não possui e vice-versa?" que admite a resposta decepcionante: "Bem, o que você pode fazer com Ruby ou Python que não pode ser feito no Intercal?" Nada nesse nível, porque Python e Ruby fazem parte da vasta família real sentada no trono de Turing aproximadamente.
Mas e quanto a isso:
O que pode ser feito graciosamente e bem em Python que não pode ser feito em Ruby com tanta beleza e boa engenharia, ou vice-versa?
Isso pode ser muito mais interessante do que a simples comparação de recursos.
fonte
O Python possui uma sintaxe explícita e integrada para compreensão de lista e geradores, enquanto no Ruby você usaria blocos de mapa e código.
Comparar
para
fonte
res=map(2 .__rpow__, range(1,10))
"Variáveis que começam com uma letra maiúscula tornam-se constantes e não podem ser modificadas"
Errado. Eles podem.
Você só recebe um aviso se o fizer.
fonte
Um pouco mais no lado da infraestrutura:
O Python tem uma integração muito melhor com o C ++ (via Boost.Python , SIP e Py ++ ) do que o Ruby, onde as opções parecem ser escritas diretamente na API do interpretador Ruby (o que você também pode fazer com o Python, é claro, mas em ambos os casos, isso é de baixo nível, tedioso e propenso a erros) ou usa SWIG (que, embora funcione e definitivamente seja ótimo se você deseja oferecer suporte a vários idiomas, não é tão bom quanto o Boost.Python ou SIP se você está procurando especificamente vincular C ++).
O Python possui vários ambientes de aplicativos da web (Django, Pylons / Turbogears, web.py, provavelmente pelo menos meia dúzia de outros), enquanto o Ruby (efetivamente) possui um: Rails. (Existem outras estruturas da Web Ruby, mas aparentemente é difícil obter muita tração contra o Rails). Esse aspecto é bom ou ruim? Difícil de dizer, e provavelmente bastante subjetivo; Posso facilmente imaginar argumentos de que a situação do Python é melhor e que a situação do Ruby é melhor.
Culturalmente, as comunidades Python e Ruby parecem um pouco diferentes, mas só posso sugerir isso porque não tenho tanta experiência interagindo com a comunidade Ruby. Estou adicionando isso principalmente na esperança de que alguém que tenha muita experiência com ambos possa amplificar (ou rejeitar) essa afirmação.
fonte
Copiar / colar descaradamente de: Alex Martelli resposta no tópico " O que há de melhor em Ruby que Python " da lista de discussão comp.lang.python .
fonte
Alguns outros de:
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/
(Se interpretei algo errado ou algum deles mudou no lado do Ruby desde que a página foi atualizada, alguém pode editar ...)
Strings são mutáveis no Ruby, não no Python (onde novas strings são criadas por "alterações").
O Ruby tem algumas convenções de caso aplicadas, o Python não.
O Python possui listas e tuplas (listas imutáveis). O Ruby possui matrizes correspondentes às listas Python, mas nenhuma variante imutável delas.
No Python, você pode acessar diretamente os atributos do objeto. No Ruby, é sempre via métodos.
Em Ruby, parênteses para chamadas de método geralmente são opcionais, mas não em Python.
Ruby tem público, privado e protegido para impor o acesso, em vez da convenção do Python de usar sublinhados e nomes diferentes.
Python tem herança múltipla. Ruby tem "mixins".
E outro link muito relevante:
http://c2.com/cgi/wiki?PythonVsRuby
O que, em particular, vincula a outro de Alex Martelli , que também está postando muitas coisas excelentes aqui no SO:
http://groups.google.com/group/comp.lang.python/msg/028422d707512283
fonte
Não tenho certeza disso, então adiciono-o como resposta primeiro.
Python trata métodos não acoplados como funções
Isso significa que você pode chamar um método como
theobject.themethod()
ou porTheClass.themethod(anobject)
.Edit: Embora a diferença entre métodos e funções seja pequena no Python e inexistente no Python 3, ela também não existe no Ruby, simplesmente porque o Ruby não possui funções. Quando você define funções, na verdade você está definindo métodos no Object.
Mas você ainda não pode pegar o método de uma classe e chamá-lo como uma função, você teria que religá-lo ao objeto que deseja chamar, o que é muito mais difícil.
fonte
TheClass.instance_method(:themethod).bind(anobject).call
seria o equivalente em rubi.Object
.Gostaria de mencionar a API do descritor Python que permite personalizar a "comunicação" de objeto a atributo. Também é digno de nota que, em Python, é possível implementar um protocolo alternativo, substituindo o padrão fornecido pela implementação padrão do
__getattribute__
método. Deixe-me dar mais detalhes sobre o acima mencionado. Descritores são classes regulares com__get__
,__set__
e / ou__delete__
métodos. Quando o intérprete encontra algo parecidoanObj.anAttr
, é executado o seguinte:__getattribute__
método deanObj
é invocado__getattribute__
recupera um objeto anAttr da classe dict__get__
,__set__
ou__delete__
objetos que podem ser chamadasComo foi mencionado, esse é o comportamento padrão. Um é livre para alterar o protocolo reimplementando
__getattribute__
.Essa técnica é muito mais poderosa que os decoradores.
fonte
Ruby construiu suporte de continuação usando
callcc
.Portanto, você pode implementar coisas legais como o operador amb
fonte
Nesta fase, o Python ainda possui melhor suporte a unicode
fonte
Python possui docstrings e o ruby não ... Ou, se não tiver, eles não são acessíveis tão facilmente quanto no python.
Ps. Se estiver errado, por favor, deixe um exemplo? Eu tenho uma solução alternativa que eu poderia monkeypatch em classes com bastante facilidade, mas eu gostaria de ter um tipo de recurso de doutrina de "maneira nativa".
fonte
O Ruby possui um loop linha por linha sobre os arquivos de entrada (o sinalizador '-n') da linha de comando, para que possa ser usado como AWK. Esta linha única de Ruby:
contará linhas como o one-liner AWK:
O Ruby recebe esse recurso por meio do Perl, que utilizou o AWK como uma maneira de integrar os administradores de sistemas com o Perl sem precisar alterar a maneira como eles fazem as coisas.
fonte
python -c "import sys; print len(list(sys.stdin))"
Ruby tem sigilos e galhos, Python não.
Edit : E uma coisa muito importante que eu esqueci (afinal, o anterior foi apenas para queimar um pouco :-p):
O Python possui um compilador JIT ( Psyco ), uma linguagem de nível mais baixo para escrever código mais rápido ( Pyrex ) e a capacidade de adicionar código C ++ embutido ( Weave ).
fonte
Meu python está enferrujado, então alguns deles podem estar em python e eu simplesmente não me lembro / nunca aprendi, mas aqui estão os primeiros que eu pensei:
Espaço em branco
Ruby lida com espaço em branco completamente diferente. Para iniciantes, você não precisa recuar nada (o que significa que não importa se você usa 4 espaços ou 1 guia). Ele também faz a continuação da linha inteligente; portanto, o seguinte é válido:
Basicamente, se você terminar com um operador, ele descobrirá o que está acontecendo.
Mixins
O Ruby possui mixins que podem estender instâncias em vez de classes completas:
Enums
Não tenho certeza se isso é o mesmo que geradores, mas no Ruby 1.9 ruby como enums, então
Referência: http://blog.nuclearsquid.com/writings/ruby-1-9-what-s-new-what-s-changed
"Argumentos de palavras-chave"
Ambos os itens listados são suportados no Ruby, embora você não possa pular valores padrão como esse. Você pode ir em ordem
Observe que c = 5 realmente atribui a variável c no escopo da chamada ao valor 5 e define o parâmetro b ao valor 5.
ou você pode fazer isso com hashes, que abordam o segundo problema
Referência: Guia Pragmático do Programador para Ruby
fonte
(
,[
ou{
Você pode ter código na definição de classe em Ruby e Python. No entanto, no Ruby você tem uma referência à classe (self). No Python, você não tem uma referência à classe, pois a classe ainda não está definida.
Um exemplo:
self neste caso é a classe e esse código imprimiria "Kaka". Não há como imprimir o nome da classe ou, de outras formas, acessar a classe a partir do corpo da definição de classe no Python.
fonte
class
instrução.A sintaxe não é uma coisa pequena, tem um impacto direto em como pensamos. Também afeta diretamente as regras que criamos para os sistemas que usamos. Como exemplo, temos a ordem das operações devido à maneira como escrevemos equações ou sentenças matemáticas. A notação padrão para matemática permite que as pessoas leiam mais de uma maneira e cheguem a respostas diferentes, dada a mesma equação. Se tivéssemos usado notação de prefixo ou postfix, teríamos criado regras para distinguir quais eram os números a serem manipulados, em vez de apenas ter regras para a ordem na qual calcular valores.
A notação padrão deixa claro de quais números estamos falando e, ao mesmo tempo, torna a ordem na qual eles são ambíguos. A notação de prefixo e postfix faz a ordem na qual calcular com simplicidade, tornando os números ambíguos. O Python já teria lambdas multilinhas se não fosse pelas dificuldades causadas pelo espaço em branco sintático. (Existem propostas para realizar esse tipo de coisa sem necessariamente adicionar delimitadores de bloco explícitos.)
Acho mais fácil escrever condições em que desejo que algo ocorra, se uma condição for falsa, muito mais fácil escrever com a instrução a menos em Ruby do que a construção "se-não" semanticamente equivalente em Ruby ou em outros idiomas, por exemplo. Se a maioria dos idiomas que as pessoas estão usando hoje tem o mesmo poder, como a sintaxe de cada idioma pode ser considerada trivial? Após recursos específicos, como blocos e mecanismos de herança, etc. a sintaxe é a parte mais importante de uma linguagem, dificilmente uma coisa superficial.
O que é superficial são as qualidades estéticas da beleza que atribuímos à sintaxe. A estética não tem nada a ver com o funcionamento da nossa cognição, a sintaxe.
fonte
Surpreso ao ver nada mencionado sobre o mecanismo "falta de método" de ruby. Eu daria exemplos dos métodos find_by _... no Rails, como um exemplo do poder desse recurso de linguagem. Meu palpite é que algo semelhante poderia ser implementado em Python, mas, pelo que sei, não existe de forma nativa.
fonte
method_missing
pode ser emulada em Python em alguns casos:class M(): def __getattr__(self, n): return lambda: "Missing! " + n; M().hi()
. No entanto, existem pequenas diferenças e eu duvido que seja idiomática em Python :-)Outra diferença nas lambdas entre Python e Ruby é demonstrada pelo problema do gerador de acumulador de Paul Graham . Reproduzido aqui:
No Ruby, você pode fazer isso:
No Python, você criaria um objeto para armazenar o estado de n:
Algumas pessoas podem preferir a abordagem explícita do Python como sendo mais clara conceitualmente, mesmo que seja um pouco mais detalhada. Você armazena o estado como faz para qualquer outra coisa. Você só precisa entender a idéia de objetos que podem ser chamados. Mas, independentemente de qual abordagem se preferir esteticamente, mostra um respeito pelo qual as lambdas do Ruby são construções mais poderosas do que as do Python.
fonte
def foo(n): def f(i): return n + i return f
.def foo(n): L=[n] def f(i): L[0] += i return L[0] return f
. No Python3, você pode usar anonlocal
palavra-chavepython nomeou argumentos opcionais
O AFAIK Ruby apenas posicionou argumentos porque b = 2 na declaração da função é uma afetação que sempre é anexada.
fonte
def my_method(param1, optional = false)
funciona no Ruby 1.8.6, 1.8.7 e, presumivelmente, 1.9!b
parâmetro nafunc
chamada e ainda mantém seu padrão. Ou seja,b
é o segundo argumento da assinatura, mas ele pode ignorá-lo prefixando o segundo parâmetro comc=
. Ruby usa hashes para simular isso, mas não é exatamente o mesmo.Ruby incorporou documentação:
fonte
http://c2.com/cgi/wiki?PythonVsRuby
http://c2.com/cgi/wiki?SwitchedFromPythonToRuby
http://c2.com/cgi/wiki?SwitchedFromRubyToPython
http://c2.com/cgi/wiki ? UsingPythonDontNeedRuby
http://c2.com/cgi/wiki?UsingRubyDontNeedPython
fonte
Com o Cargo, você pode " exigir bibliotecas sem sobrecarregar seu espaço para nome ".
fonte