스칼라 심볼의 목적?
Symbol의 목적은 무엇이며 왜 특별한 리터럴 구문이 필요 'FooSymbol할까요?
기호는 빠르게 비교할 수있는 닫힌 식별자 집합이있는 경우 사용됩니다. String인스턴스 가 두 개인 경우 인턴이 보장되지는 않습니다 [1]. 따라서이를 비교하려면 길이를 비교하고 문자별로 동일한 지 확인하여 내용을 자주 확인해야합니다. 로 Symbol인스턴스 비교는 단순 eq검사 (즉, ==자바)가 일정 시간 그래서 (즉 O (1)) 찾아 볼 수 있습니다.
이러한 종류의 구조는 동적 언어에서 더 많이 사용되는 경향이 있습니다 (특히 Ruby 및 Lisp 코드는 기호를 많이 사용하는 경향이 있음). 정적으로 유형이 지정된 언어에서는 일반적으로 유형별로 항목 세트를 제한하기를 원하기 때문입니다.
하지만 제한된 키 세트가있는 키 / 값 저장소가 있고 정적 유형 객체를 사용하는 것이 다루기 힘들 Map[Symbol, Data]다면 스타일 구조가 적합 할 수 있습니다.
StringJava (및 Scala)에서의 인턴에 대한 참고 사항 : Java String는 어쨌든 어떤 경우에는 인턴됩니다. 특히 문자열 리터럴은 자동으로 인턴 intern()되며 String인스턴스 에서 메서드를 호출하여 인턴 된 복사본을 반환 할 수 있습니다 . String그러나 모든 s가 인턴 된 것은 아닙니다. 즉, 동일한 인스턴스가 아닌 경우 런타임이 전체 검사를 수행해야합니다. interning은 두 개의 동일한 인턴 문자열을 더 빠르게 비교하지만 다른 문자열을 비교하는 런타임을 향상 시키지는 않습니다. 인턴 Symbol이 보장 되는 이점 이 있으므로이 경우 단일 참조 동등성 검사로 동등 또는 불평등을 증명하기에 충분합니다.
[1] 인턴은 객체를 생성 할 때 동일한 객체가 이미 존재하는지 확인하고 존재한다면이를 사용하는 과정입니다. 즉, 동일한 두 개의 객체가 있으면 정확히 동일한 객체입니다 (즉, 참조가 동일 함). 이것의 단점은 어떤 객체를 사용해야하는지 찾는 데 비용이 많이 들고, 객체가 가비지 수집되도록하려면 복잡한 구현이 필요할 수 있다는 것입니다.
Symbol인턴입니다.
목적, 즉 Symbol보다 더 효율적 String들과 Symbol동일한 이름을 동일한에 대해 참조된다 s에서 Symbol객체 (따라서 동일한 해시를 가짐).
Ruby 기호에 대해 읽어보십시오 : http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols
의 이름 만 얻을 수 있습니다 Symbol.
scala> val aSymbol = 'thisIsASymbol
aSymbol: Symbol = 'thisIsASymbol
scala> assert("thisIsASymbol" == aSymbol.name)
Scala에서는 그다지 유용하지 않으므로 널리 사용되지 않습니다. 일반적으로 식별자를 지정하려는 곳에 기호를 사용할 수 있습니다.
예를 들어 2.8.0 용으로 계획된 리플렉션 호출 기능은 obj o 'method(arg1, arg2)'o'가 Any에 추가 된 메서드이고 Symbol에 apply (Any *) 메서드가 추가 된 구문을 사용했습니다 (둘 다 'pimp my library'포함).
또 다른 예는 HTML 문서를 만드는 더 쉬운 방법을 만들고 싶은 경우 "div"를 사용하여 요소를 지정하는 대신 'div. 그런 다음 Symbol에 연산자를 추가하여 요소 생성을위한 구문 설탕을 만드는 것을 상상할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/3554362/purpose-of-scalas-symbol
'Program Club' 카테고리의 다른 글
| Python에서 문자열 변수 초기화 : ""또는 None? (0) | 2020.12.04 |
|---|---|
| Django 쿼리에서 반환하는 열을 제한하는 방법은 무엇입니까? (0) | 2020.12.04 |
| 동일하지 않은 데이터 프레임을 병합하고 누락 된 행을 0으로 바꿉니다. (0) | 2020.12.04 |
| 여러 열에서 NOT 선택 (0) | 2020.12.04 |
| pymongo에서 "show dbs"를 발행하는 방법 (0) | 2020.12.04 |