Python에서 Ruby로

Python도 매우 좋은 범용 프로그래밍 언어입니다. Python에서 Ruby로 넘어오면 Python을 배울 때보다 조금 더 구문이 늘었을 뿐이라는 걸 알게 될 것입니다.

비슷한 점

Python처럼, Ruby에서도…

  • 대화형 프롬프트가 있습니다(irb라고 부릅니다).
  • 커맨드 라인에서 문서를 읽을 수 있습니다(pydoc 대신 ri 명령을 사용합니다).
  • 라인 종결이 없습니다(일반적인 줄 바꿈 제외).
  • 문자열 리터럴은 Python의 따옴표 세 개로 감싼 문자열처럼 여러 줄에 걸쳐 입력할 수 있습니다.
  • 대괄호는 리스트에, 중괄호는 사전형에 사용합니다.(사전형은 Ruby에선 “해시”라고 부릅니다.)
  • 배열은 같은 동작을 합니다(배열을 더하면 하나의 긴 배열을 만들지만, a3 = [ a1, a2 ]처럼 구성하면 배열의 배열이 됩니다).
  • 객체는 강 타입인 동시에 동적 타입입니다.
  • 모든 것은 객체이며, 변수는 객체의 참조일 뿐입니다.
  • 키워드는 조금 다르지만, 예외는 거의 비슷하게 동작합니다.
  • 내장형 문서화 툴이 있습니다(Ruby에서는 rdoc이라 부릅니다).
  • 일급(first-class) 함수, 익명 함수, 클로저와 함께 함수형 프로그래밍 지원이 뛰어납니다.

다른 점

Python과는 다르게, Ruby에서는…

  • 문자열은 변경 가능합니다.
  • 상수(변경할 의도가 없는 변수)를 만들 수 있습니다.
  • 강제적인 대소문자 규칙이 있습니다(예를 들어, 클래스 이름은 대문자로 시작해야 하고, 변수는 소문자로 시작해야 합니다).
  • 한 종류의 리스트 컨테이너(배열)밖에 없으며 배열은 변경 가능합니다.
  • 큰따옴표를 사용한 문자열은 (\t 같은) 이스케이프 시퀀스와 특수한 “표현식 치환” 구문을 사용할 수 있습니다(이는 "add " + "strings " + "together"처럼 적을 필요 없이 Ruby 표현식을 문자열 사이에 넣을 수 있게 합니다). 작은따옴표는 Python의 r"raw strings"와 같습니다.
  • “새로운 스타일”, “옛날 스타일” 클래스가 없습니다. 한 종류입니다. (Python 3 이상은 이 문제가 없습니다만, Python 2와의 완벽한 하위 호환은 되지 않습니다.)
  • 속성에 직접 액세스할 수 없습니다. Ruby에서는 전부 메서드 호출입니다.
  • 메서드를 호출할 때의 괄호는 대부분 생략 가능합니다.
  • Python의 _자발적인_ 밑줄 __규칙__ 대신 public, private, protected로 액세스를 강제할 수 있습니다.
  • “믹스인”은 다중 상속 대신 사용합니다.
  • 빌트인 클래스에 메서드를 추가하고 수정할 수 있습니다. 두 언어 다 어느 시점에서든 클래스를 열고 수정할 수 있지만, Python은 빌트인 클래스의 수정을 방지하고 있고, Ruby는 아닙니다.
  • TrueFalse 대신 truefalse를 사용합니다. (그리고 None 대신 nil을 사용합니다.)
  • 참 거짓을 평가할 때 falsenil만이 거짓 값으로 평가됩니다. (0, 0.0, "", []를 포함해) 나머지는 전부 참입니다.
  • elif 대신 elsif입니다.
  • import 대신 require입니다. 그것 말고 사용법은 같습니다.
  • (아래의 docstring 대신) 코드 위의 일반적인 주석은 문서를 생성하는 데 사용합니다.
  • 좀 더 기억해야 하지만, 빨리 배울 수 있는 많은 단축 명령이 있습니다. 단축 명령은 Ruby를 좀 더 재미있고, 생산적이게 합니다.
  • (Python의 del문처럼) 한 번 설정한 변수를 해제하는 방법은 없습니다. 오래된 값을 가비지 컬렉션하도록 변수를 nil로 리셋할 수는 있지만 변수는 스코프가 끝날 때까지 심볼 테이블에 남습니다.
  • yield 키워드가 다르게 동작합니다. Python에서는 함수의 호출 스코프 바깥으로 반환해서 실행하게 됩니다. 해당 함수로 다시 돌아오는 건 외부 코드의 책임입니다. Ruby에서는 yield가 마지막 인수로 전달된 다른 함수를 실행하고, 그 즉시 함수로 돌아옵니다.
  • Python은 익명 함수로 람다 하나만을 지원하지만, Ruby는 블록, 프록, 람다를 포함합니다.