Jest wiele dyskusji na temat Pythona kontra Ruby i wszyscy uważam je za całkowicie nieprzydatne, ponieważ wszyscy odwracają się, dlaczego funkcja X jest do kitu w języku Y lub ten język twierdzi, że język Y nie ma X, chociaż w rzeczywistości tak jest. Wiem też dokładnie, dlaczego wolę Python, ale jest to również subiektywne i nie pomogłoby każdemu wybrać, ponieważ mogą nie mieć takich samych upodobań rozwojowych jak ja.
Interesujące byłoby zatem obiektywnie wymienić różnice. Więc nie ma „lambdów Pythona do bani”. Zamiast tego wyjaśnij, co potrafią zrobić jagnięta Ruby, czego nie potrafią Python. Bez podmiotowości. Przykładowy kod jest dobry!
Proszę nie mieć kilku różnic w jednej odpowiedzi. I głosuj w górę na te, o których wiesz, że są poprawne, a na głos, o których wiesz, że są niepoprawne (lub są subiektywne). Również różnice w składni nie są interesujące. Wiemy, że Python robi z wcięciami to, co Ruby robi z nawiasami i końcami, i że @ w Pythonie nazywa się self.
AKTUALIZACJA: To jest teraz wiki społeczności, więc możemy tutaj dodać duże różnice.
Ruby ma odwołanie do klasy w treści klasy
W Ruby masz odniesienie do klasy (ja) już w treści klasy. W Pythonie nie ma odniesienia do klasy, dopóki jej budowa nie zostanie zakończona.
Przykład:
class Kaka
puts self
end
self w tym przypadku jest klasą, a ten kod wypisuje „Kaka”. Nie ma sposobu, aby wydrukować nazwę klasy lub w inny sposób uzyskać dostęp do klasy z treści definicji klasy w Pythonie (poza definicjami metod).
Wszystkie klasy można modyfikować w Ruby
Pozwala to opracowywać rozszerzenia klas podstawowych. Oto przykład rozszerzenia szyny:
class String
def starts_with?(other)
head = self[0, other.length]
head == other
end
end
Python (wyobraź sobie, że nie ma ''.startswith
metody):
def starts_with(s, prefix):
return s[:len(prefix)] == prefix
Możesz użyć go w dowolnej sekwencji (nie tylko w łańcuchach). Aby go użyć, należy go zaimportować jawnie, np from some_module import starts_with
.
Ruby ma funkcje skryptowe podobne do Perla
Ruby ma najwyższej klasy wyrażenia regularne, zmienne $, awk / perl wiersz po wierszu i inne funkcje, które sprawiają, że jest bardziej odpowiedni do pisania małych skryptów powłoki, które wyciszają pliki tekstowe lub działają jako kod kleju dla innych programów.
Ruby ma kontynuacje pierwszej klasy
Dzięki instrukcji callcc. W Pythonie możesz tworzyć kontynuacje za pomocą różnych technik, ale nie ma wbudowanej obsługi języka.
Ruby ma bloki
Za pomocą instrukcji „do” możesz utworzyć wieloliniową anonimową funkcję w Ruby, która zostanie przekazana jako argument do metody przed do i wywołana stamtąd. W Pythonie należy to zrobić albo przez przekazanie metody, albo za pomocą generatorów.
Rubin:
amethod { |here|
many=lines+of+code
goes(here)
}
Python (bloki Ruby odpowiadają różnym konstrukcjom w Pythonie):
with amethod() as here: # `amethod() is a context manager
many=lines+of+code
goes(here)
Lub
for here in amethod(): # `amethod()` is an iterable
many=lines+of+code
goes(here)
Lub
def function(here):
many=lines+of+code
goes(here)
amethod(function) # `function` is a callback
Co ciekawe, instrukcja wygody w języku Ruby do wywoływania bloku nazywa się „wydajnością”, która w Pythonie utworzy generator.
Rubin:
def themethod
yield 5
end
themethod do |foo|
puts foo
end
Pyton:
def themethod():
yield 5
for foo in themethod():
print foo
Chociaż zasady są różne, wynik jest uderzająco podobny.
Ruby ułatwia programowanie w stylu funkcjonalnym (przypominającym potok)
myList.map(&:description).reject(&:empty?).join("\n")
Pyton:
descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions))
Python ma wbudowane generatory (które są używane jak bloki Ruby, jak wspomniano powyżej)
Python obsługuje generatory w tym języku. W Ruby 1.8 możesz użyć modułu generatora, który używa kontynuacji do utworzenia generatora z bloku. Lub możesz po prostu użyć bloku / proc / lambda! Co więcej, w Ruby 1.9 Fibres są i mogą być używane jako generatory, a klasa Enumerator jest wbudowanym generatorem 4
docs.python.org ma ten przykład generatora:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
Porównaj to z powyższymi przykładami bloków.
Python ma elastyczną obsługę przestrzeni nazw
W Ruby, gdy importujesz plik require
, wszystkie elementy zdefiniowane w tym pliku znajdą się w twojej globalnej przestrzeni nazw. Powoduje to zanieczyszczenie przestrzeni nazw. Rozwiązaniem tego są moduły Rubys. Ale jeśli utworzysz przestrzeń nazw z modułem, musisz użyć tej przestrzeni nazw, aby uzyskać dostęp do zawartych klas.
W Pythonie plik jest modułem i możesz zaimportować zawarte w nim nazwy from themodule import *
, w ten sposób zanieczyszczając przestrzeń nazw, jeśli chcesz. Ale możesz również zaimportować wybrane nazwy za pomocą from themodule import aname, another
lub możesz po prostu, import themodule
a następnie uzyskać dostęp do nazw za pomocą themodule.aname
. Jeśli chcesz mieć więcej poziomów w swojej przestrzeni nazw, możesz mieć pakiety, które są katalogami z modułami i __init__.py
plikiem.
Python ma dokumenty
Dokumenty są łańcuchami, które są dołączone do modułów, funkcji i metod i mogą być introspektywne w czasie wykonywania. Pomaga to w tworzeniu takich rzeczy, jak polecenie pomocy i automatyczna dokumentacja.
def frobnicate(bar):
"""frobnicate takes a bar and frobnicates it
>>> bar = Bar()
>>> bar.is_frobnicated()
False
>>> frobnicate(bar)
>>> bar.is_frobnicated()
True
"""
Odpowiedniki Ruby są podobne do javadocs i znajdują się nad metodą zamiast w niej. Można je odzyskać w czasie wykonywania z plików przy użyciu metody 1.9 # przykład użycia source_location
Python ma wiele elementów dziedziczenia
Ruby nie robi tego („celowo” - patrz strona internetowa Ruby, zobacz tutaj, jak to się robi w Ruby ). Ponownie wykorzystuje koncepcję modułu jako rodzaj klas abstrakcyjnych.
Python ma rozumienie list / nagrań
Pyton:
res = [x*x for x in range(1, 10)]
Rubin:
res = (0..9).map { |x| x * x }
Pyton:
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Rubin:
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'}
Rubin:
>> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]
=> {1=>"4", 3=>"16"}
Python ma dekoratorów
Rzeczy podobne do dekoratorów można również tworzyć w Ruby i można również argumentować, że nie są tak potrzebne jak w Pythonie.
Różnice w składni
Ruby wymaga „end” lub „}”, aby zamknąć wszystkie swoje zakresy, podczas gdy Python używa tylko białych znaków. Ostatnio podjęto w Ruby próby dopuszczenia wcięć tylko w białych znakach http://github.com/michaeledgar/seamless
Odpowiedzi:
Ruby ma pojęcia bloków , które są zasadniczo składniowym cukrem wokół części kodu; są sposobem na tworzenie zamknięć i przekazywanie ich do innej metody, która może, ale nie musi, używać bloku. Blok można później wywołać za pomocą
yield
instrukcji.Na przykład prosta definicja
each
metodyArray
może być następująca:Następnie możesz wywołać to w następujący sposób:
Python ma anonimowe funkcje / zamknięcia / lambdas, ale nie ma całkiem bloków, ponieważ brakuje niektórych przydatnych cukru syntaktycznego. Istnieje jednak co najmniej jeden sposób, aby uzyskać go w sposób ad hoc. Zobacz na przykład tutaj .
źródło
Przykład Python
Funkcje są pierwszorzędnymi zmiennymi w Pythonie. Możesz zadeklarować funkcję, przekazać ją jako obiekt i zastąpić:
Jest to podstawowa cecha współczesnych języków skryptowych. JavaScript i Lua też to robią. Ruby nie traktuje funkcji w ten sposób; nazywanie funkcji wywołuje ją.
Oczywiście istnieją sposoby na robienie tych rzeczy w Ruby, ale nie są to operacje pierwszej klasy. Na przykład możesz zawinąć funkcję w Proc.new, aby traktować ją jako zmienną - ale wtedy nie jest to już funkcja; jest to obiekt z metodą „wywołania”.
Funkcje Ruby nie są obiektami pierwszej klasy
Funkcje Ruby nie są obiektami pierwszej klasy. Funkcje muszą być zawinięte w obiekt, aby je rozdzielić; wynikowy obiekt nie może być traktowany jak funkcja. Funkcje nie mogą być przypisywane w sposób pierwszej klasy; zamiast tego należy wywołać funkcję w obiekcie kontenera, aby je zmodyfikować.
źródło
x = y
nie przez wywołanieself.class.send(:define_method, :func, method(:func2))
. Twój „kontrprzykład” pokazuje, że funkcje Ruby nie są najwyższej klasy. Jeśli się nie zgadzasz, możesz opublikować własną odpowiedź; nie wtrącaj zamieszania w moje.def ... end
ruby nie są funkcjami. Są to metody (sposób, w jaki je zdefiniowałeśKernel
). Metody mogą być niezwiązane (przy użyciu#method
metody), które następnie są obiektami. Ruby najbardziej zbliżone do funkcji toProc
instancje, które są również obiektami i można je przekazywać lub wywoływać. Ma również specjalną składnię do przekazywania pojedynczego wywołania zwrotnegoProc
do metody, co omawia John Feminella w swojej odpowiedzi .UnboundMethod
może być PITA, tho.Ostatecznie wszystkie odpowiedzi będą na pewnym poziomie subiektywne, a dotychczasowe odpowiedzi w zasadzie dowodzą, że nie można wskazać żadnej funkcji, która nie byłaby możliwa w innym języku w równie miły (jeśli nie podobny) sposób , ponieważ oba języki są bardzo zwięzłe i wyraziste.
Lubię składnię Pythona. Musisz jednak zagłębić się nieco głębiej niż składnia, aby znaleźć prawdziwe piękno Ruby. W konsystencji Ruby jest piękno podobne do zen. Chociaż żaden trywialny przykład nie jest w stanie tego całkowicie wyjaśnić, postaram się tu znaleźć taki, aby wyjaśnić, co mam na myśli.
Odwróć słowa w tym ciągu:
Gdy zastanawiasz się, jak to zrobić, wykonaj następujące czynności:
W Ruby zrobiłbyś to:
Dokładnie tak, jak myślisz o tym, w tej samej sekwencji, jedno wywołanie metody po drugim.
W Pythonie wyglądałoby to bardziej tak:
Nie jest trudno to zrozumieć, ale nie ma takiego samego przepływu. Temat (zdanie) jest pochowany w środku. Operacje są mieszanką funkcji i metod obiektowych. To jest trywialny przykład, ale odkrywa się wiele różnych przykładów, kiedy naprawdę pracujesz z Ruby i rozumiesz go, szczególnie w przypadku nie trywialnych zadań.
źródło
Python ma mentalność „wszyscy tu jesteśmy dorośli”. Zatem przekonasz się, że Ruby ma takie rzeczy jak stałe, podczas gdy Python nie (chociaż stałe Ruby wywołują tylko ostrzeżenie). Myślenie w języku Python polega na tym, że jeśli chcesz uczynić coś stałym, powinieneś wstawiać nazwy zmiennych do wszystkich wielkich liter i nie zmieniać ich.
Na przykład Ruby:
Pyton:
źródło
Możesz importować tylko określone funkcje z modułu w Pythonie. W Ruby importujesz całą listę metod. Możesz „nieimportować” ich w Ruby, ale nie o to chodzi.
EDYTOWAĆ:
weźmy ten moduł Ruby:
jeśli umieścisz to w swoim kodzie:
zobaczysz, że zarówno method1 i Method2 został dodany do nazw. Nie można zaimportować tylko metody 1 . Albo je importujesz, albo wcale. W Pythonie możesz importować tylko wybrane metody. Jeśli miałoby to nazwę, może to się nazywa selektywne importowanie?
źródło
import bla; bla.foo()
w Ruby?module
rzeczywistości jest to trochę mylące. Moduły są zasadniczo klasy sansnew
,allocate
metody. Działają najlepiej jako sposób udostępniania kodu dla poszczególnych klas / obiektów, a nie jako mechanizm partycjonowania bibliotek lub dzielenia kodu między programami.Od Ruby stronie :
Podobieństwa Jak w Pythonie, w Ruby, ...
Różnice W przeciwieństwie do Pythona, w Ruby, ...
źródło
To, co Ruby ma nad Pythonem, to jego możliwości języka skryptowego. Język skryptowy w tym kontekście oznacza, że należy go używać do „kodu kleju” w skryptach powłoki i ogólnej manipulacji tekstem.
Są one najczęściej udostępniane Perlowi. Pierwszej klasy wbudowane wyrażenia regularne, $ -Variables, przydatne opcje wiersza poleceń, takie jak Perl (-a, -e) itp.
Wraz ze zwięzłą, ale epxresywną składnią jest idealny do tego rodzaju zadań.
Python jest dla mnie bardziej dynamicznym typem języka biznesowego, który jest bardzo łatwy do nauczenia i ma zgrabną składnię. Nie tak „fajny” jak Ruby, ale schludny. To, co Python ma dla mnie w Ruby, to ogromna liczba powiązań dla innych bibliotek. Powiązania z bibliotekami Qt i innymi bibliotekami GUI, wiele bibliotek obsługi gier oraz i. Ruby ma znacznie mniej. Chociaż często używane powiązania, np. Do baz danych, są dobrej jakości, znalazłem niszowe biblioteki, które są lepiej obsługiwane w Pythonie, nawet jeśli dla tej samej biblioteki istnieje również powiązanie Ruby.
Powiedziałbym więc, że oba języki mają swoje zastosowanie i to zadanie określa, którego z nich użyć. Oba są wystarczająco łatwe do nauczenia się. Używam ich obok siebie. Ruby do skryptów i Python do samodzielnych aplikacji.
źródło
Nie sądzę, że „Ruby ma X, a Python nie, podczas gdy Python ma Y, a Ruby nie” to najbardziej użyteczny sposób na to. Są to dość podobne języki, z wieloma wspólnymi umiejętnościami.
Różnica polega w dużej mierze na tym, że język czyni go eleganckim i czytelnym. Przywołując przywołany przykład, obaj teoretycznie mają lambdy, ale programiści Pythona zwykle ich unikają, a konstrukcje wykonane przy ich użyciu nie wyglądają tak czytelnie ani idiomatycznie jak w Rubim. Tak więc w Pythonie dobry programista będzie chciał wybrać inną ścieżkę rozwiązania problemu niż w Ruby, tylko dlatego, że jest to lepszy sposób na zrobienie tego.
źródło
for format in respond_to()
.respond_to
Metoda nic nie znaczący powrót - po prostu reaguje bieżącego żądania HTTP.do
Wrespond_to do
to początek bloku. W tym bloku rozmawiamy z tymczasowym obiektem (oznaczonymformat
w tym przykładzie), który implementuje bardzo podstawowy DSL do odpowiadania na żądanie HTTP.Chciałbym zasugerować wariant pierwotnego pytania: „Co Ruby ma w Pythonie i na odwrót?” która przyznaje rozczarowującą odpowiedź: „Co możesz zrobić z Ruby lub Pythonem, czego nie można zrobić w Intercalu?” Nic na tym poziomie, ponieważ zarówno Python, jak i Ruby są częścią rozległej rodziny królewskiej siedzącej na tronie w przybliżeniu Turinga.
Ale co z tym:
Co można zrobić z wdziękiem i dobrze w Pythonie, czego nie można zrobić w Ruby przy takim pięknie i dobrej inżynierii lub odwrotnie?
To może być o wiele bardziej interesujące niż zwykłe porównanie funkcji.
źródło
Python ma jawną, wbudowaną składnię dla list-comprehenions i generatorów, podczas gdy w Ruby używałbyś bloków map i kodu.
Porównać
do
źródło
res=map(2 .__rpow__, range(1,10))
„Zmienne zaczynające się od dużej litery stają się stałymi i nie można ich modyfikować”
Źle. Mogą.
Otrzymasz ostrzeżenie tylko wtedy, gdy to zrobisz.
źródło
Nieco więcej po stronie infrastruktury:
Python ma znacznie lepszą integrację z C ++ (poprzez rzeczy takie jak Boost.Python , SIP i Py ++ ) niż Ruby, gdzie opcje wydają się albo pisać bezpośrednio w interfejsie API interpretera Ruby (co można oczywiście również zrobić w Pythonie, ale w obu przypadkach jest to niski poziom, żmudne i podatne na błędy) lub użyj SWIG (który, choć działa i zdecydowanie jest świetny, jeśli chcesz obsługiwać wiele języków, nie jest tak przyjemny jak Boost.Python lub SIP, jeśli szczególnie chcesz powiązać C ++).
Python ma wiele środowisk aplikacji internetowych (Django, Pylons / Turbogears, web.py, prawdopodobnie co najmniej pół tuzina innych), podczas gdy Ruby (skutecznie) ma jedno: Railsy. (Inne frameworki Ruby istnieją, ale najwyraźniej mają trudności z uzyskaniem dużej przyczepności do Railsów). Czy ten aspekt jest dobry czy zły? Trudno powiedzieć i prawdopodobnie dość subiektywny; Mogę łatwo wyobrazić sobie argumenty, że sytuacja w Pythonie jest lepsza, a sytuacja w Ruby jest lepsza.
Pod względem kulturowym społeczności Python i Ruby wydają się nieco inne, ale mogę tylko to wskazać, ponieważ nie mam zbyt dużego doświadczenia w interakcji ze społecznością Ruby. Dodam to głównie w nadziei, że ktoś, kto ma duże doświadczenie z oboma, może wzmocnić (lub odrzucić) to stwierdzenie.
źródło
Bezwstydnie skopiuj / wklej z: Alex Martelli odpowiedz na temat „ Co jest lepsze w Ruby niż Python ” z listy dyskusyjnej comp.lang.python .
źródło
Niektóre inne z:
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/
(Jeśli błędnie zinterpretowałem coś lub którykolwiek z nich zmienił się po stronie Ruby od czasu aktualizacji tej strony, ktoś może edytować ...)
Ciągi można modyfikować w języku Ruby, a nie w języku Python (gdzie nowe ciągi są tworzone przez „zmiany”).
Ruby ma pewne wymuszone konwencje przypadków, Python nie.
Python ma zarówno listy, jak i krotki (listy niezmienne). Ruby ma tablice odpowiadające listom w języku Python, ale nie ma niezmiennego wariantu.
W Pythonie możesz bezpośrednio uzyskać dostęp do atrybutów obiektu. W Ruby zawsze odbywa się to metodami.
W Ruby nawiasy dla wywołań metod są zwykle opcjonalne, ale nie w Pythonie.
Ruby ma funkcje publiczne, prywatne i chronione w celu wymuszania dostępu, zamiast konwencji Pythona polegającej na stosowaniu podkreślenia i zniekształcaniu nazw.
Python ma wiele elementów dziedziczenia. Ruby ma „mixiny”.
I kolejny bardzo istotny link:
http://c2.com/cgi/wiki?PythonVsRuby
Który w szczególności prowadzi do innego dobrego autorstwa Alexa Martellego , który również publikuje tutaj wiele świetnych rzeczy na SO:
http://groups.google.com/group/comp.lang.python/msg/028422d707512283
źródło
Nie jestem tego pewien, dlatego najpierw dodaję odpowiedź.
Python traktuje niezwiązane metody jako funkcje
Oznacza to, że możesz wywołać metodę tak jak
theobject.themethod()
lub przezTheClass.themethod(anobject)
.Edycja: Chociaż różnica między metodami i funkcjami jest niewielka w Pythonie, a nie istnieje w Pythonie 3, to również nie istnieje w Ruby, po prostu dlatego, że Ruby nie ma funkcji. Kiedy definiujesz funkcje, tak naprawdę definiujesz metody w Object.
Ale nadal nie możesz przyjąć metody jednej klasy i nazwać jej jako funkcji, musiałbyś ponownie powiązać ją z obiektem, do którego chcesz wywołać, co jest znacznie bardziej skomplikowane.
źródło
TheClass.instance_method(:themethod).bind(anobject).call
będzie równoważnym rubinem.Object
.Chciałbym wspomnieć o interfejsie API deskryptora Pythona, który umożliwia dostosowanie komunikacji między obiektami. Warto również zauważyć, że w Pythonie można zaimplementować alternatywny protokół, zastępując domyślną podaną przez domyślną implementację
__getattribute__
metody. Pozwól, że podam więcej szczegółów na temat wyżej wymienionych. Deskryptory są regularne zajęcia z__get__
,__set__
i / lub__delete__
metody. Gdy interpreter napotka coś podobnegoanObj.anAttr
, wykonywane są następujące czynności:__getattribute__
anObj
wywoływana jest metoda__getattribute__
pobiera obiekt AnAttr ze słownika klasy__get__
,__set__
albo__delete__
wywoływalne obiektyJak wspomniano, jest to zachowanie domyślne. Można dowolnie zmieniać protokół poprzez ponowną implementację
__getattribute__
.Ta technika jest znacznie potężniejsza niż dekoratorzy.
źródło
Ruby ma wbudowaną obsługę kontynuacji
callcc
.Dlatego możesz wdrożyć fajne rzeczy, takie jak amb-operator
źródło
Na tym etapie Python nadal ma lepszą obsługę Unicode
źródło
Python ma dokumenty i ruby nie ... Lub jeśli nie, nie są one tak łatwo dostępne jak w Pythonie.
Ps. Jeśli się mylę, proszę, zostaw przykład? Mam obejście, które można łatwo dopasować do klas, ale chciałbym mieć coś w rodzaju „rodzimej” metody docstring.
źródło
Ruby ma pętlę linia po linii nad plikami wejściowymi (flaga „-n”) z wiersza poleceń, dzięki czemu można go używać jak AWK. Ten Rubinowy jednowarstwowy:
policzy linie takie jak AWK:
Ruby dostaje to za pośrednictwem Perla, który wziął to z AWK jako sposób na włączenie sysadminów do Perla bez konieczności zmiany sposobu, w jaki robią.
źródło
python -c "import sys; print len(list(sys.stdin))"
Ruby ma pieczęci i gałązki, Python nie.
Edycja : I jedna bardzo ważna rzecz, o której zapomniałem (w końcu poprzednią było tylko trochę rozpalić :-p):
Python ma kompilator JIT ( Psyco ), wyraźnie niższy poziom języka do pisania szybszego kodu ( Pyrex ) oraz możliwość dodawania wbudowanego kodu C ++ ( Weave ).
źródło
Mój pyton jest zardzewiały, więc niektóre z nich mogą znajdować się w Pythonie i po prostu nie pamiętam / nigdy się nie nauczyłem, ale oto kilka pierwszych, o których myślałem:
Biała przestrzeń
Ruby całkowicie zmienia białe znaki. Na początek nie trzeba nic wciskać (co oznacza, że nie ma znaczenia, czy użyjesz 4 spacji lub 1 tabulacji). Wykonuje również kontynuację inteligentnej linii, więc następujące informacje są prawidłowe:
Zasadniczo, jeśli zakończysz operatorem, dowiesz się, co się dzieje.
Mixiny
Ruby ma mixiny, które mogą rozszerzać instancje zamiast pełnych klas:
Enums
Nie jestem pewien, czy jest to to samo, co generatory, ale od Ruby 1.9 ruby jak wyliczenia, więc
Odniesienie: http://blog.nuclearsquid.com/writings/ruby-1-9-what-s-new-what-s-changed
„Argumenty słów kluczowych”
Oba wymienione tam elementy są obsługiwane w Ruby, chociaż nie można pominąć takich wartości domyślnych. Możesz albo przejść w kolejności
Zauważ, że c = 5 faktycznie przypisuje zmiennej c w zakresie wywołującym wartość 5 i ustawia parametr b na wartość 5.
lub możesz to zrobić za pomocą skrótów, które rozwiązują drugi problem
Odniesienie: Pragmatyczny przewodnik dla programistów Rubiego
źródło
(
,[
lub{
Możesz mieć kod w definicji klasy zarówno w Ruby, jak i Python. Jednak w Ruby masz odniesienie do klasy (self). W Pythonie nie ma odniesienia do klasy, ponieważ klasa nie jest jeszcze zdefiniowana.
Przykład:
self w tym przypadku jest klasą, a ten kod wypisuje „Kaka”. W Pythonie nie ma możliwości wydrukowania nazwy klasy ani w żaden inny sposób uzyskania dostępu do klasy z treści definicji klasy.
źródło
class
instrukcja.Składnia nie jest drobną sprawą, ma bezpośredni wpływ na to, jak myślimy. Ma to również bezpośredni wpływ na reguły, które tworzymy dla używanych przez nas systemów. Jako przykład podajemy kolejność operacji ze względu na sposób pisania równań lub zdań matematycznych. Standardowa notacja matematyczna pozwala ludziom czytać ją na więcej niż jeden sposób i uzyskiwać różne odpowiedzi na podstawie tego samego równania. Gdybyśmy użyli notacji prefiksowej lub postfiksowej, stworzylibyśmy reguły, aby odróżnić, którymi liczbami podlegały manipulacje, zamiast mieć tylko reguły dotyczące kolejności obliczania wartości.
Standardowa notacja wyraźnie mówi o liczbach, o których mówimy, przy ustalaniu kolejności ich niejednoznaczności. Notacje przedrostków i postfiksów ustalają kolejność, w której obliczenia są proste, a liczby dwuznaczne. Python miałby już wielowierszowe lambdy, gdyby nie trudności spowodowane syntaktyczną białą spacją. (Istnieją propozycje odciągnięcia tego rodzaju rzeczy bez konieczności dodawania wyraźnych separatorów bloków).
Łatwiej jest mi napisać warunki, w których chcę, aby coś się zdarzyło, jeśli warunek jest fałszywy, dużo łatwiej jest napisać za pomocą instrukcji chyba w Rubim niż semantycznie równoważna konstrukcja „jeśli-nie” w Rubim lub innych językach. Jeśli większość języków, których ludzie używają dzisiaj, ma taką samą moc, to jak składnię każdego języka można uznać za trywialną rzecz? Po określonych cechach, takich jak bloki i mechanizmy dziedziczenia itp., Składnia jest najważniejszą częścią języka, a nie powierzchowną rzeczą.
To, co powierzchowne, to estetyczne cechy piękna, które przypisujemy składni. Estetyka nie ma nic wspólnego z tym, jak działa nasze poznanie, podobnie jak składnia.
źródło
Zaskoczony faktem, że nic nie wspominało o mechanizmie ruby „brak metody”. Podałbym przykłady metod find_by _... w Railsach, jako przykład potęgi tej funkcji językowej. Domyślam się, że coś podobnego można zaimplementować w Pythonie, ale o ile wiem, nie ma go natywnie.
źródło
method_missing
mogą być emulowane w Pythonie w niektórych przypadkach:class M(): def __getattr__(self, n): return lambda: "Missing! " + n; M().hi()
. Istnieją jednak niewielkie różnice i wątpię, czy jest to idiomatyczne w Pythonie :-)Inną różnicę w lambdach między Pythonem a Ruby pokazuje problem generatora akumulatorów Paula Grahama . Przedruk tutaj:
W Ruby możesz to zrobić:
W Pythonie utworzyłbyś obiekt do przechowywania stanu n:
Niektórzy ludzie mogą preferować wyraźne podejście w języku Python jako bardziej przejrzyste koncepcyjnie, nawet jeśli jest to nieco bardziej szczegółowe. Przechowujesz stan tak jak robisz dla czegokolwiek innego. Musisz tylko owinąć głowę wokół pomysłu na obiekty, które można wywoływać. Ale niezależnie od tego, które podejście preferuje się estetycznie, pokazuje jeden szacunek, w którym lambdy Ruby są silniejszymi konstrukcjami niż Python.
źródło
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
. W Python3 możesz użyćnonlocal
słowa kluczowego.python nazwał opcjonalne argumenty
AFAIK Ruby ma tylko ustawione argumenty, ponieważ b = 2 w deklaracji funkcji to wpływ, który zawsze się dołącza.
źródło
def my_method(param1, optional = false)
działa w Ruby 1.8.6, 1.8.7 i prawdopodobnie 1.9!b
parametr wfunc
wywołaniu i nadal zachowuje wartość domyślną. Oznacza to, żeb
jest drugim argumentem w podpisie, ale może go pominąć, poprzedzając przedrostek drugim parametrem za pomocąc=
. Ruby używa skrótów, aby to zasymulować, ale nie jest to dokładnie to samo.Ruby ma osadzoną dokumentację:
źródło
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
źródło
Dzięki Cargo możesz „ wymagać bibliotek bez zaśmiecania przestrzeni nazw ”.
źródło