복붙노트

[SCALA] 스칼라의 심볼을 사용하는 실제 예?

SCALA

스칼라의 심볼을 사용하는 실제 예?

작은 따옴표 '하고있는 문자열 상수의 일종으로 시작하는 이름 - 스칼라 심볼이있다.

나는 (그들이 콜론으로 시작) 루비에서 문자를 알고있다. 루비 그들은 부재 변수 게터와 세터 생성 원한다면, 일부 메타 프로그래밍 작업을 위해 사용된다 (예를 들어 attr_reader 이름은 이름에 대한 게터를 생성).

아직 스칼라 코드 심볼의 사용을 많이 보지 못했어요. 스칼라의 기호에 대한 실질적인 사용은 무엇입니까?

해결법

  1. ==============================

    1.기호는 정말 스칼라에 적합합니까?

    기호는 정말 스칼라에 적합합니까?

    리스프의 아름다운 땅에서, 코드는 클래스, 함수 및 변수 같은 것들에 대한 식별자로 사용되는 중첩 된 자신 (문자열, 숫자 등)을 나타내는 문자 객체의 목록 및 기호로 표시됩니다. 리스프 코드는 매우 간단한 구조를 가지고로서, 리스프는 프로그래머가 (컴파일 시간과 런타임에 모두)를 조작 할 수 있습니다. 이 작업을 수행 할 때 분명, 프로그래머는 필연적으로 데이터 객체와 같은 문자가 발생합니다.

    기호 (그리고 필요가 되실으로는) 어떤 경우에 리스프에 개체 그래서, 왜 해시 테이블 키 또는뿐만 아니라 열거 형으로 사용하지? 이 일을하는 자연적인 방법, 그리고 당신이 특별한 열거 형을 정의하지 않는 한 그것은, 언어 간단한을 유지합니다.

    요약하면, 기호는 자연스럽게 코드 조작, 열거, 및 키잉에 사용됩니다. 그들은 단지 자신의 키로 문자열을 사용할 수 있도록하지만, 자바 사람들은 (당신의 전통적인 리스프는 않습니다) 기본적으로 해시 키 사이의 동치 관계와 같은 ID를 사용하지 않습니다. 열거 타입은 스칼라에서 별도로 정의됩니다. 그리고 마지막으로, 데이터와 같은 코드는 전혀 언어에 의해 지원되지 않습니다.

    그래서 더, 내 인상은 기호 스칼라 언어에 속하지 않는 것이 없다. 그게 내가이 질문에 대한 대답에 눈을 지키려고했다. 그들은 여전히 ​​내가 지금 생각할 수없는 스칼라 심볼의 정품 사용을 보여줍니다 수 있습니다.

    (부록은 : 코드를 조작하고, 문자열이없는 것이 특징 때 리스프 방언에 따라, 리스프 기호는 네임 스페이스 자격을 갖춘 물론이며, 대단히 유용한 기능이 될 수 있습니다.)

  2. ==============================

    2.웹의 주위에 약간의 검색은 문자열을 비교 한의 심볼 (기호 리터럴)의 의미 (같은 언어) 스칼라 따라서 어쩌면 컴파일러 의식 의미의 문제, 그리고 것 같다.

    웹의 주위에 약간의 검색은 문자열을 비교 한의 심볼 (기호 리터럴)의 의미 (같은 언어) 스칼라 따라서 어쩌면 컴파일러 의식 의미의 문제, 그리고 것 같다.

    '문자열'일련의 문자로 구성된 데이터 타입이다. 당신은 문자열에서 작동 등을 조작 할 수 있습니다. 문자열은 의미 론적으로 화면에 출력 할 수있는 메시지에 파일 이름에서 텍스트 데이터, CSV 파일, 또는 어떤에서 선이 될 수 있습니다.

    번호 (숫자의 시퀀스)는 데이터 유형의 값이다 말 같은 컴파일러 -and 따라서 IDE- 문자열은, 데이터 형식 문자열의 값이다 : 정수. "foo"와 "bar"사이의 차이는 프로그램 수준에 없습니다.

    OTOH 기호 의미, 즉 프로그램의 항목을 식별하는 식별자이다. 이 문제에서 그들은 클래스 이름, 메소드 이름 또는 속성 이름과 같다. 그러나 클래스 이름은 클래스 -i.e.를 식별하면서 클래스 '구조 behaviour- 및 방법 이름 식별 메소드 -i.e. 선언 속성 집합 매개 변수와 statements-, 심볼 이름은 식별 기호 -i.e. itsself, 아무것도 더 -.

    컴파일러는 명시 적 기호 'foo에와'바, 구별 할 수 그래서 그는 수업 푸와 바 구별처럼. 컴파일러의 심볼 테이블의 일환으로, 당신은 예를 들어, IDE를 동일한 메커니즘을 적용 할 수 있습니다 당신은 Foo 클래스의 사용을 검색처럼 'foo는의 사용 (이 기호에 즉 참조)을 검색합니다.

    비교에서는, "foo"문자열 검색 전체 텍스트 검색과 같은 다른 접근을 필요로한다. 이 프로그램 코드에서 4711의 모든 항목에 대한 검색과 같은 의미를 다음과 같습니다.

    내가 틀렸다면의 내가 그것을 이해 어떻게, 누가 좀 해결 될 수도 있습니다.

  3. ==============================

    3.스칼라 책에 따르면, 기호 구금되어있다 : "당신이 두 번 같은 기호를 작성하는 경우, 두 표현식이 동일한 기호 객체를 참조합니다."

    스칼라 책에 따르면, 기호 구금되어있다 : "당신이 두 번 같은 기호를 작성하는 경우, 두 표현식이 동일한 기호 객체를 참조합니다."

    그들은 문자 그대로의 형태로 나타날 경우 반면에, 문자열은 (자바 적어도 그들은 전적으로 확실 스칼라에 대해) 구금된다. 당신은 다음 컬렉션에 넣고 문자열의 직렬화를 많이 할 경우 같아요 그래서, 대신 기호를 사용하고 자신에게 약간의 메모리를 절약 할 수 있습니다.

    그러나 나는 내가 완전히 그들의 사용을 확신 아니에요, skaffman에 동의합니다.

    . (루비는 기호가 종종 해시의 키로서 사용, 떨어져 당신이주는 메타 프로그래밍 예에서,있다, 문자열이 구금되지 않습니다 때문에 루비이 유용하다 : 모든 문자열은 새로운 메모리를 할당에서 스칼라가 유용 할 수 있습니다. 내가 언급 한 바와 같이 당신이 (비) 직렬화 많이와 결합하면, 자바 문자열이 아니라 구금되지 않도록.)

  4. ==============================

    4.나는 기능적인 언어를 사용하기 때문에 스칼라를 추가 같아요.

    나는 기능적인 언어를 사용하기 때문에 스칼라를 추가 같아요.

    그들은 자신의 존재의 중심 포인트의 종류 상징을 통해 식별자를 참조하는 기능을 추가하지만, 잊어 버렸습니다. 그 중 일부를 제공 스칼라 2.8에서 실험적인 기능이있다. 나는 전체의 API 문서의 관련 부분을 인용합니다 :

    @experimental
    
    object Invocation 
    extends AnyRef
    

    반사 호출을위한 더 편리한 구문. 사용 예제 :

        class Obj { private def foo(x: Int, y: String): Long = x + y.length }
    

    다음 두 가지 방법 중 반 성적 하나를 호출 할 수 있습니다 :

        import scala.reflect.Invocation._
        (new Obj) o 'foo(5, "abc")                 // The 'o' method returns Any
        val x: Long = (new Obj) oo 'foo(5, "abc")  // The 'oo' method casts to expected type.
    

    당신은 OO 메소드를 호출 충분히 도움 inferencer 유형을 제공하지 않는 경우는 ClassCastException에서 가장 가능성이 추론 아무것도를 초래할 것 것이다.

    저자 폴 필립스

  5. ==============================

    5.나는 심볼 사이의 비교가 더 빠르다 생각합니다. 당신이 얼랑을 사용했다면, 기계의 경계를 넘어 잘 작동이 빠른 메시지 주위를 통과 할 때 기호는 톤을 사용하는 당신은 뭔가 싸구려를 원하고. 내가 스칼라, IIRC에 원격 어떤 상태 행위자에 확실하지 않다, 그들은 오히려 사기 있었지만, 그들은 얼랑에로 미래의 때를 장소에, 기호는 물론 거의 같은 방법으로 매우 유용 할 수 있습니다. 또한 케이스 클래스는, 혜택의 일부는 명백한로, 다시, 기호는 여전히 저렴하지 않습니다.

    나는 심볼 사이의 비교가 더 빠르다 생각합니다. 당신이 얼랑을 사용했다면, 기계의 경계를 넘어 잘 작동이 빠른 메시지 주위를 통과 할 때 기호는 톤을 사용하는 당신은 뭔가 싸구려를 원하고. 내가 스칼라, IIRC에 원격 어떤 상태 행위자에 확실하지 않다, 그들은 오히려 사기 있었지만, 그들은 얼랑에로 미래의 때를 장소에, 기호는 물론 거의 같은 방법으로 매우 유용 할 수 있습니다. 또한 케이스 클래스는, 혜택의 일부는 명백한로, 다시, 기호는 여전히 저렴하지 않습니다.

  6. ==============================

    6.난 당신이 코드에서 기존의 식별자가 아닌 물건의 이름을 참조 할 때 사용할 것 같아요. 스칼라 책은 데이터베이스 열 이름을 참조하는 예제를 제공합니다 - 그것은 임의의 문자열이 아닌, 실제로 물건의 이름입니다.

    난 당신이 코드에서 기존의 식별자가 아닌 물건의 이름을 참조 할 때 사용할 것 같아요. 스칼라 책은 데이터베이스 열 이름을 참조하는 예제를 제공합니다 - 그것은 임의의 문자열이 아닌, 실제로 물건의 이름입니다.

    그래도, 내가 완전히 확신 아니에요, 조금 얇은입니다.

  7. ==============================

    7.기호는 정말 스칼라에서 사용되는 때 한 경우 이름을 지정할 수 있습니다. 액세스 데이터베이스에 2.2 용도의 anorm을 재생합니다. 여기에 간단한 추가 엔티티 방법에 대한 코드 샘플은 간다 :

    기호는 정말 스칼라에서 사용되는 때 한 경우 이름을 지정할 수 있습니다. 액세스 데이터베이스에 2.2 용도의 anorm을 재생합니다. 여기에 간단한 추가 엔티티 방법에 대한 코드 샘플은 간다 :

    def add(e:Entity): Option[Long] = {
        DB.withConnection {implicit conn =>
            SQL("insert into ENTITY(name, description) values({name}, {description})").on('name -> e.name, 'description -> e.description).executeInsert()
        }
    }
    

    당신이 CSTE 연구진의 심볼의 사용을 볼 수 있도록 (BLA BLA BLA) 또한 대신 기호 문자열 리터럴을 사용하는 것이 절대적으로 유효하고, 어떤 사람은 그렇게하고 있지만 anorm 소스 코드에서 해당 메소드 서명은 정말 기호 paremeter 유형을 사용합니다.

  8. ==============================

    8.이미 언급 한 바와 같이, 기호는 이월 다른 (더) 함수형 언어에서. 뭔가 다른 사람은 상징의 역할을 기입 할뿐만 아니라 것입니다 언급하지 않은,하지만 그들은 (아마도 마이너스 성능 이점)도 키워드의 가장 가까운 동일합니다. 제 생각에는, 그들은 명시 적 식별자를 의미하는 키워드로 더 유용하다.

    이미 언급 한 바와 같이, 기호는 이월 다른 (더) 함수형 언어에서. 뭔가 다른 사람은 상징의 역할을 기입 할뿐만 아니라 것입니다 언급하지 않은,하지만 그들은 (아마도 마이너스 성능 이점)도 키워드의 가장 가까운 동일합니다. 제 생각에는, 그들은 명시 적 식별자를 의미하는 키워드로 더 유용하다.

    아래는 내가 키워드 및 기호의 Clojure 문서에서 법원의 설명을 포함합니다.

    스칼라 기호는 일부 언어에서 문자만큼 강력하지 않습니다. 따라서, 그들은 하나로서 유용하지 않습니다. 그들이 키워드와 같은 메타 프로그래밍 및 성능 이점을 제공 할 수없는 이유 그러나, 나는 볼 수 없습니다. 적어도, 그들은 읽기 쉬운 코드를 만들 수 있습니다.

  9. from https://stackoverflow.com/questions/1324466/practical-examples-of-using-symbols-in-scala by cc-by-sa and MIT license