Ruby에는 Python에 없는 것이 있으며 그 반대의 경우도 마찬가지입니다.

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |

Python 대 Ruby에 대한 많은 토론이 있으며 저는 그것들이 완전히 도움이 되지 않는다고 생각합니다. 왜냐하면 그것들은 모두 왜 기능 X가 언어 Y에서 형편없거나 언어 Y에 X가 없다고 주장하기 때문입니다. 또한 내가 Python을 선호하는 이유를 정확히 알고 있지만 이는 주관적이고 나와 같은 개발 취향을 갖고 있지 않을 수 있으므로 선택하는 데 도움이 되지 않습니다.

그러므로 차이점을 객관적으로 나열하는 것은 흥미로울 것입니다.따라서 "Python"람다는 짜증나지 않습니다." 대신 Ruby의 람다가 할 수 있는 일을 Python이 할 수 없는 일을 설명하십시오. 주관성은 없습니다. 예제 코드가 좋습니다!

한 답변에 여러 차이점이 있지 않도록 하십시오. 그리고 당신이 아는 것은 옳고, 당신이 아는 것은 옳지 않은 것(또는 주관적인 것)에 투표하십시오. 또한 구문의 차이는 흥미롭지 않습니다. 우리는 Python이 들여쓰기를 사용하여 Ruby가 대괄호와 끝으로 하는 것과 @를 Python에서 self라고 한다는 것을 알고 있습니다.

업데이트: 이것은 이제 커뮤니티 위키이므로 여기에 큰 차이점을 추가할 수 있습니다.

업데이트: 이것은 이제 커뮤니티 위키입니다.

p>

Ruby는 클래스 본문에 클래스 참조가 있습니다.

Ruby에서는 이미 클래스 본문에 클래스(self)에 대한 참조가 있습니다. Python에서는 클래스 생성이 완료될 때까지 클래스에 대한 참조가 없습니다.

예:

class Kaka puts self end 

이 경우 self는 클래스이고 이 코드는 "Kaka"를 출력합니다. 클래스 이름을 출력하거나 다른 방법으로 Python의 클래스 정의 본문에서 클래스에 액세스할 수 있는 방법이 없습니다(외부 메소드 정의).

모든 클래스는 Ruby에서 변경 가능합니다.

이를 통해 핵심 클래스에 대한 확장을 개발할 수 있습니다. 다음은 레일 확장의 예입니다.

 class String def starts_with?(other) head = self[0, other.length] head == other end end 

Python (가 없다고 상상해보십시오."" startswith 메소드):

def starts_with(s, prefix): return s[:len(prefix)] == prefix 

당신 모든 시퀀스(문자열뿐만 아니라)에서 사용할 수 있습니다. 이를 사용하려면 명시적으로 가져와야 합니다(예: from some_module import starts_with).

Ruby에는 Perl과 유사한 스크립팅 기능이 있습니다.

Ruby는 일급 정규 표현식, $-변수, awk/perl 라인 바이 라인 입력 루프 및 텍스트 파일을 병합하거나 다른 프로그램의 글루 코드 역할을 하는 작은 쉘 스크립트를 작성하는 데 더 적합한 기타 기능을 가지고 있습니다.

Ruby는 일급 연속체를 가지고 있습니다.

callcc 문 덕분에. Python에서는 다양한 기술로 연속을 만들 수 있지만 언어에 내장된 지원은 없습니다.

Ruby에는 블록이 있습니다.

"do" 문을 사용하면 다중 do 앞의 메소드에 인수로 전달되고 거기에서 호출되는 Ruby의 라인 익명 함수. Python에서는 대신 메서드를 전달하거나 생성기를 사용하여 이 작업을 수행합니다.

Ruby:

amethod { |here| many=lines+of+code gos(here) } 

Python(Ruby 블록은 Python의 다른 구성에 해당):

with amethod() as here: # `amethod()는 컨텍스트 관리자입니다. many=lines+of+code gos(here) 

또는

for here in amethod() : # `amethod()`는 반복 가능한 many=lines+of+code gos(here) 

또는

def function(here): many =lines+of+code gos(here) amethod(function) # `function`은 콜백입니다. 

흥미롭게도 Ruby에서 블록을 호출하기 위한 편의문을 "yield"라고 합니다. Python에서는 생성기를 생성합니다.

Ruby:

def themethod yield 5 end themethod do |foo| puts foo end 

Python:

def themethod(): foo in themethod()에서 yield 5: print foo 

원칙은 다르지만 결과는 놀라울 정도로 비슷합니다.

Ruby는 보다 쉽게 기능적 스타일(파이프 같은) 프로그래밍을 지원합니다.

myList.map(& :description).reject(&:empty?).join(" ") 

Python:

descriptions = (f.description() for f in mylist) " ".join(filter(len, descriptions)) 

Python에는 내장 생성기가 있습니다(위에서 언급한 것처럼 Ruby 블록처럼 사용됨)

Python은 해당 언어로 생성기를 지원합니다. Ruby 1.8에서는 블록에서 생성기를 생성하기 위해 연속을 사용하는 생성기 모듈을 사용할 수 있습니다. 또는 block/proc/lambda를 사용할 수 있습니다! 게다가 Ruby 1.9에서 Fibers는 생성기로 사용 가능하며 Enumerator 클래스는 내장 생성기입니다. 4

docs.python. org에는 다음과 같은 생성기 예제가 있습니다.

def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] 

이를 위의 블록 예제와 대조하십시오.

Python은 유연한 이름 공간 처리를 가지고 있습니다.

Ruby에서 require를 사용하면 해당 파일에 정의된 모든 항목이 전역 네임스페이스에 포함됩니다. 이로 인해 네임스페이스 오염이 발생합니다. 이에 대한 솔루션은 Rubys 모듈입니다. 그러나 모듈을 사용하여 네임스페이스를 만들면 포함된 클래스에 액세스하려면 해당 네임스페이스를 사용해야 합니다.

파이썬에서 파일은 모듈이며 를 사용하여 포함된 이름을 가져올 수 있습니다. frommodule import *, 따라서 원하는 경우 네임스페이스를 오염시킵니다. 그러나 frommodule import name, other를 사용하여 선택한 이름만 가져올 수도 있습니다. >. 네임스페이스에 더 많은 레벨을 원하면 모듈과 __init__.py 파일이 있는 디렉토리인 패키지를 가질 수 있습니다.

Python에는 독스트링이 있습니다.

독스트링 모듈, 함수 및 메서드에 첨부된 문자열이며 런타임에 검사할 수 있습니다. 이것은 도움말 명령 및 자동 문서화와 같은 것을 생성하는 데 도움이 됩니다.

def frobnicate(bar): """frobnicate가 막대를 가져와 frobnicate >>> bar = Bar( ) >>bar.is_frobnicated() False >> frobnicate(bar) >>> bar.is_frobnicated() True """ 

루비 "에 해당하는 것은 javadocs와 유사하며 메소드 내부가 아니라 메소드 위에 있습니다. 1.9"의 Method#source_location 예제 사용

Python에는 다중 상속이 있습니다.

Ruby에는 없습니다("의도적으로" -- 참조 Ruby의 웹사이트, 여기에서 방법 보기 "Ruby로 완료). 모듈 개념을 추상 클래스 유형으로 재사용합니다.

Python에는 목록/딕셔너리 이해가 있습니다.

Python:

res = [x* x for x in range(1, 10)] 

Ruby:

res = (0..9).map { |x| x * x } 

파이썬:

>>> (x*x for x in range(10)) <generator object <genexpr> at 0xb7c1ccd4> >>> 목록(_) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

루비:

p = 절차 { |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"} 

루비:

>> 해시[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}] => {1=>"4", 3=>"16"} 

Python에는 데코레이터가 있습니다.

데코레이터와 유사한 것은 Ruby에서도 생성할 수 있으며, Python에서만큼 필요하지 않다고 주장할 수도 있습니다.

구문 차이

Ruby는 모든 범위를 닫으려면 "end" 또는 "}"가 필요하지만 Python은 공백만 사용합니다. 최근 Ruby에서 공백만 들여쓰기를 허용하려는 시도가 있었습니다. http://github.com /michaledgar/seamless