답변:
Java 용어에서 기호는 인턴 문자열입니다. 예를 들어, 참조 동등성 비교 ( eq
Scala 및 ==
Java에서)는 일반 동등성 비교 ( ==
Scala 및 equals
Java에서) 와 동일한 결과를 제공합니다 . JVM의 변덕에 따라 'abcd eq 'abcd
true를 반환하지만 "abcd" eq "abcd"
그렇지 않을 수도 있습니다. 일반적으로 동적으로 생성 된 문자열은 제외).
기호를 사용하는 다른 언어로는 Lisp ( 'abcd
Scala와 같은 사용 ), Ruby ( :abcd
), Erlang 및 Prolog ( abcd
; 기호 대신 원자라고 함)가 있습니다.
나는 문자열의 구조에 관심이 없을 때 기호를 사용하고 순전히 무언가의 이름으로 사용합니다. 예를 들어, "price"라는 열을 포함하는 CD를 나타내는 데이터베이스 테이블이있는 경우 "price"의 두 번째 문자가 "r"이거나 열 이름을 연결하는 것에 대해 신경 쓰지 않습니다. 따라서 Scala의 데이터베이스 라이브러리는 테이블 및 열 이름에 기호를 합리적으로 사용할 수 있습니다.
코드에서 말한 메서드 이름을 나타내는 일반 문자열이 있으면 전달 될 수 있으므로 제대로 전달하지 못하는 것입니다. 이것은 일종의 데이터 / 코드 경계 문제입니다. 선을 그리는 것이 항상 쉬운 것은 아닙니다.하지만이 예제에서 메서드 이름이 데이터보다 코드가 많다고 말하면 명확하게 식별 할 수있는 무언가를 원합니다. .
Symbol Literal은 코드에서 사용되는 구문으로 이전 문자열 데이터를 명확하게 구분하는 역할을합니다. 표시하려는 위치에 실제로 있습니다. 이것은 단순한 문자열 데이터가 아니라 실제로 코드의 일부입니다. IDE와 같은 아이디어는 다르게 강조 표시되며 도구가 주어지면 텍스트 검색 / 바꾸기를 수행하는 대신 리팩토링 할 수 있습니다.
이 링크 는 꽤 잘 설명합니다.
파이썬 은 모든 변수, 함수, 모듈 등의 이름을 가진 " 인터 닝 된 문자열" 의 내부 전역 테이블을 관리 합니다.이 테이블을 사용하면 인터프리터는 더 빠른 검색과 최적화를 수행 할 수 있습니다. intern
함수 ( sys.intern
python3에서) 로이 프로세스를 강제 할 수 있습니다 .
또한 Java와 Scala 는 빠른 검색을 위해 자동으로 "인턴 된 문자열" 을 사용 합니다. 스칼라를 사용하면이 intern
메서드를 사용하여 문자열의 인턴을 강제 할 수 있지만이 프로세스가 모든 문자열에서 작동하는 것은 아닙니다. 심볼은 인턴이 보장되는 이점이 있으므로 단일 참조 동등성 검사로 동등성 또는 부등식을 증명하는 데 충분합니다.