Scala의 기호 리터럴에 대한 몇 가지 사용 사례는 무엇입니까?


93

기호 리터럴의 사용은 내가 스칼라에서 읽은 내용에서 즉시 명확하지 않습니다. 누군가 실제 사용을 공유하고 싶습니까?

기호 리터럴에 포함되는 특정 Java 관용구가 있습니까? 비슷한 구조를 가진 언어는 무엇입니까? 나는 파이썬 배경에서 왔고 그 언어에 유사한 것이 있는지 확신하지 못합니다.

'HelloWorld 대'HelloWorld '를 사용하게 된 동기는 무엇입니까?

감사

답변:


76

Java 용어에서 기호는 인턴 문자열입니다. 예를 들어, 참조 동등성 비교 ( eqScala 및 ==Java에서)는 일반 동등성 비교 ( ==Scala 및 equalsJava에서) 와 동일한 결과를 제공합니다 . JVM의 변덕에 따라 'abcd eq 'abcdtrue를 반환하지만 "abcd" eq "abcd"그렇지 않을 수도 있습니다. 일반적으로 동적으로 생성 된 문자열은 제외).

기호를 사용하는 다른 언어로는 Lisp ( 'abcdScala와 같은 사용 ), Ruby ( :abcd), Erlang 및 Prolog ( abcd; 기호 대신 원자라고 함)가 있습니다.

나는 문자열의 구조에 관심이 없을 때 기호를 사용하고 순전히 무언가의 이름으로 사용합니다. 예를 들어, "price"라는 열을 포함하는 CD를 나타내는 데이터베이스 테이블이있는 경우 "price"의 두 번째 문자가 "r"이거나 열 이름을 연결하는 것에 대해 신경 쓰지 않습니다. 따라서 Scala의 데이터베이스 라이브러리는 테이블 및 열 이름에 기호를 합리적으로 사용할 수 있습니다.


25
스칼라에서 ==는 .equals 일을한다는 것을 기억할 가치가있을 것입니다. 그래서 실제로는 동등성을 참조하는 "eq"메소드를 사용할 때 차이가있을 것입니다. 그러나 한 가지 보너스는 기호 간의 비교가 매우 저렴하다는 것입니다.
Calum

@Calum, 두 문자열 간의 비교입니다. 자바 인턴 (더 많거나 적은) 모든 문자열.
Elazar Leibovich

4
@Elazar : 정말 사실인가요? 나는 자바가 리터럴 (즉, 사소한 예제의 거의 모든 문자열과 프로덕션 소프트웨어의 문자열이 거의 없음)만을 인턴으로한다는 인상을 받았다. 기호의 유스 케이스는 일반적으로 리터럴 값 (처음부터 빌드하는 경우가 많을 것 같음)이기 때문에 얻을 수있는 주요 이점은 더 설명적인 유형일뿐입니다.
Calum

1
@Elazar 기호는 인턴 된 값에 의존 할 수 있지만 Strings는 선택 사항이며 일부 사용 사례를 최적화 할 수 있기 때문에 그렇지 않습니다. 심볼은 무엇보다 동적으로 생성 된 Enum과 비슷합니다. 나는 마지막 응답에서 링크 한 답변에 대해 자세히 설명했습니다. 더 많은 것을 읽으십시오.
Calum

3
그래서 "안녕하세요, 세상!" 'helloWorld는 14392가 아닌 사람들에게 친숙한 가치입니다.
CW Holeman II

26

코드에서 말한 메서드 이름을 나타내는 일반 문자열이 있으면 전달 될 수 있으므로 제대로 전달하지 못하는 것입니다. 이것은 일종의 데이터 / 코드 경계 문제입니다. 선을 그리는 것이 항상 쉬운 것은 아닙니다.하지만이 예제에서 메서드 이름이 데이터보다 코드가 많다고 말하면 명확하게 식별 할 수있는 무언가를 원합니다. .

Symbol Literal은 코드에서 사용되는 구문으로 이전 문자열 데이터를 명확하게 구분하는 역할을합니다. 표시하려는 위치에 실제로 있습니다. 이것은 단순한 문자열 데이터가 아니라 실제로 코드의 일부입니다. IDE와 같은 아이디어는 다르게 강조 표시되며 도구가 주어지면 텍스트 검색 / 바꾸기를 수행하는 대신 리팩토링 할 수 있습니다.

링크 는 꽤 잘 설명합니다.


1
이것은 유용한 설명입니다. 그것은 나를 열거 대안의 관점에서 생각한다 - 서투른 될 수있는
javadba

2

파이썬 은 모든 변수, 함수, 모듈 등의 이름을 가진 " 인터 닝 된 문자열" 의 내부 전역 테이블을 관리 합니다.이 테이블을 사용하면 인터프리터는 더 빠른 검색과 최적화를 수행 할 수 있습니다. intern함수 ( sys.internpython3에서) 로이 프로세스를 강제 할 수 있습니다 .

또한 Java와 Scala 는 빠른 검색을 위해 자동으로 "인턴 된 문자열" 을 사용 합니다. 스칼라를 사용하면이 intern메서드를 사용하여 문자열의 인턴을 강제 할 수 있지만이 프로세스가 모든 문자열에서 작동하는 것은 아닙니다. 심볼은 인턴이 보장되는 이점이 있으므로 단일 참조 동등성 검사로 동등성 또는 부등식을 증명하는 데 충분합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.