그렇다면 왜 루비 제작자들은 symbols
언어 개념을 사용해야 합니까?
글쎄, 그들은 엄격히 "해야"하지 않았으며, 선택했습니다. 또한 엄밀히 말하면 Symbol
s는 언어의 일부가 아니라 핵심 라이브러리의 일부입니다. 그들은 않는 언어 수준 리터럴 구문을 가지고 있지만, 당신이 호출하여 구성해야한다면 그들은 단지 잘 작동 Symbol::new
.
나는 비 루비 프로그래머의 관점에서 그것을 이해하려고합니다. 나는 많은 다른 언어를 배웠고 루비가 부르는 것을 다루고 있는지 아닌지를 지정할 필요가 없다는 것을 알았습니다 symbols
.
당신은 그 "다른 많은 언어들"이 무엇인지 말하지 않았지만, Symbol
루비와 같은 데이터 타입 을 가진 언어의 작은 발췌문이 있습니다 :
Symbol
다른 형태 의 기능을 제공하는 다른 언어도 있습니다 . 자바에서는, 예를 들어, 루비의 특징 String
:의 두 (실제로는 3 개) 유형으로 분할 String
하고 StringBuilder
/을 StringBuffer
. 반면에, 루비의 기능 Symbol
유형은 자바로 접혀 String
유형 : 자바 String
들 수 구금 , 리터럴 문자열 및 String
평가 상수 식 자동 억류되어 컴파일 시간의 결과들, 동적으로 생성 String
들 호출하여 구금 될 수있다 String.intern
방법. String
Java 의 인턴 은 Symbol
Ruby 의 인턴 과 동일 하지만 별도의 유형으로 구현되지는 않으며 Java와 다른 상태입니다.String
(참고 : 이전 버전의 Ruby에서는 이전에 String#to_sym
호출 String#intern
되었고 해당 메소드는 여전히 레거시 별명으로 존재합니다.)
주요 질문은 다음과 같습니다. symbols
Ruby 의 개념이 자신과 다른 언어에 대한 성능 의도로 존재 합니까?
Symbol
s는 무엇보다도 특정 의미론을 가진 데이터 유형입니다 . 이러한 의미론은 일부 수행 가능한 작업 (예 : 빠른 O (1) 평등 테스트)을 구현할 수도 있지만 이것이 주된 목적은 아닙니다.
아니면 언어가 쓰여진 방식 때문에 존재해야하는 것입니까?
Symbol
루비 언어에서는 전혀 필요하지 않습니다. 루비는 그것들 없이는 잘 작동합니다. 그것들은 순전히 라이브러리 기능입니다. 언어와 관련이있는 언어에는 정확히 한 곳이 있습니다 Symbol
. def
메소드 정의 표현식 Symbol
은 정의중인 메소드의 이름을 나타내는 것으로 평가 됩니다. 그러나 이는 최근의 변경 사항으로, 그 전에는 반환 값을 지정하지 않은 채로 두었습니다. MRI는 단순히로 평가하고 nil
Rubinius는 Rubinius::CompiledMethod
객체로 평가하는 등의 작업을 수행했습니다. UnboundMethod
… 또는 단지 a 로 평가할 수도 있습니다 String
.
루비의 프로그램이 파이썬이나 노드보다 더 가볍고 빠를까요? 그렇다면, 그 때문 symbols
일까요?
나는 당신이 여기서 무엇을 요구하는지 잘 모르겠습니다. 성능은 대부분 언어가 아닌 구현 품질의 문제입니다. 또한 Node는 언어가 아니며 ECMAScript를위한 이벤트 I / O 프레임 워크입니다. IronPython 및 MRI에서 동등한 스크립트를 실행하면 IronPython이 더 빠를 수 있습니다. CPython 및 JRuby + Truffle에서 동등한 스크립트를 실행하면 JRuby + Truffle이 더 빠를 수 있습니다. 이과는 아무 상관이 없습니다 Symbol
들하지만, 구현의 품질 : JRuby를 + 트러플이 적극적으로 최적화 컴파일러를 가지고, 플러스 고성능 JVM의 전체 최적화 기계, CPython의 간단한 인터프리터입니다.
루비의 의도 중 하나는 사람이 읽고 쓸 수 있도록하는 것이기 때문에 창작자가 인터프리터 자체에서 다른 언어에서와 같이 개선 된 기능을 구현함으로써 코딩 과정을 쉽게 할 수 없었습니까?
위 Symbol
의 컴파일러 최적화되지 않습니다. 그것들은 특정 의미론을 가진 별도의 데이터 타입입니다. 그들은 YARV처럼하지 flonums 에 대한 개인 내부 최적화하고, Float
의. 상황과 동일하지 않다 Integer
, Bignum
그리고 Fixnum
어느 되어야 보이지 전용 내부 최적화 상세하지만, 불행히도이 아니다. (이 마지막으로하는 제거 루비 2.4에서 수정 될 것입니다 Fixnum
및 Bignum
단지와 잎 Integer
.)
Java의 특수한 상태로 Java가하는 방식을 수행 String
한다는 것은 항상 특수 상태 에 있는지 여부 String
와 상황에 따라 자동으로 특정 상태 에 있는지 여부에 대해주의를 기울여야한다는 것을 의미합니다 . 그것은 단순히 별도의 데이터 유형을 갖는 것보다 훨씬 높은 부담입니다.
기호에 대해 언어에 구애받지 않는 정의와 다른 언어로 표시해야하는 이유가 있습니까?
Symbol
name 또는 label 의 개념을 나타내는 데이터 유형입니다 . Symbol
s는 값 객체 이며, 불변이며, 일반적으로 즉시 (언어가 그러한 것을 구별하는 경우) 무국적이며 정체성이 없습니다. 두 Symbol
똑같 음도 동일하다는 것이 보장됩니다. 즉, 똑같은 두 Symbol
s가 실제로는 동일 Symbol
합니다. 이는 값 평등과 참조 평등이 동일하므로 평등이 효율적이며 O (1)임을 의미합니다.
언어로 된 이유는 언어와 관계없이 동일합니다. 일부 언어는 다른 언어보다 더 많은 언어를 사용합니다.
예를 들어 Lisp 제품군에는 "가변"이라는 개념이 없습니다. 대신, Symbol
값과 관련이 있습니다.
반사 또는 내성적 인 기능을 가진 언어에서 Symbol
의 자주 루비, 반사하는 API의 예를 반영 엔티티의 이름을 표시,하는 데 사용됩니다 Object#methods
, Object#singleton_methods
, Object#public_methods
, Object#protected_methods
, 및 Object#public_methods
반환 Array
의 Symbol
(그들은 단지뿐만 아니라 반환 할 수 있지만들 Array
의 Method
들). Object#public_send
A는 소요 Symbol
(그것도 허용하지만 인수로 전송하는 메시지의 이름을 나타내는 String
뿐만 아니라, Symbol
더 정확한 의미이다).
ECMAScript에서 Symbol
s는 미래에 ECMAScript 기능을 안전하게 만드는 기본 구성 요소입니다. 그들은 또한 성찰에 큰 역할을합니다.