무엇이 array get
반환, 참조 또는 값? 나는리스트를 값으로 가지는 배열을 가지고 있으며리스트는 자주 수정되어야한다. 그렇게하는 효율적인 방법은 무엇입니까?배열에서 참조 또는 값을 반환합니까?
답변
처음 몇 가지 기본 사항. Tcl에는 참조가 없습니다. 무엇이든. 따라서 tcl의 모든 명령은 항상 값을 반환합니다.
첫 번째 질문에 대한 간단한 대답은 값을 반환한다는 것입니다.
tcl의 가치 의미론이 어떻게 작동하는지에 대해 자세히 알아 보려면 두 가지 방법이 있습니다.
처음에는 언어 사양에서 나온 언어가 있습니다. 즉, 사용자/프로그래머의 관점. 이 관점에서 보면 tcl은 프로세스 문자열이라는 한 가지 작업 만 수행 할 수 있습니다. tcl의 모든 것은 문자열입니다. 좀더 기술적으로 tcl은 극도로 강력한 가치 의미론을 가지고 있고 어떤 참조 의미론도 거의 없다는 것을 제외하고는 (C는 숫자를 선호한다는 것을 제외하고는 C와 같은 종류의 문자열을 의미합니다).
그렇다면 목록은 무엇입니까? 글쎄,이 관점에서, 목록은 특별히 형식이 지정된 문자열 이상입니다. 문자열이 목록처럼 보이면 목록입니다. 그렇지 않은 경우 잘못된 목록입니다. 두 경우 모두 두 줄입니다. 숫자에 관해서도 마찬가지입니다.
그렇다면 배열은 무엇입니까? 자, 배열은 약간 특별합니다. 같은 방식으로 파일은 특별하고 URL은 특별합니다. 파일의 값 (내용)을 얻으려면 open
과 read
및 gets
과 같은 명령을 사용하십시오. 배열의 값을 얻으려면 array get
과 같은 명령과 특수한 $array_name(key)
구문을 사용합니다. 배열을 일종의 내장 된 간단한 키 - 값 쌍 데이터베이스로 생각할 수 있습니다. $array_name
은 배열의 값 (내용)의 문자열 표현 대신 구문 오류를 생성하기 때문에 tcl에서 일반 변수처럼 작동하지 않습니다. 그러나 array get
은 배열을 문자열 표현으로 다시 직렬화 할 수 있으므로 모든 문자열이 모든 관점에서 다시 잘 나타납니다.
두 번째 관점은 언어가 구현되는 방식입니다. C 레벨에서 tcl의 모든 것은 객체이고 변수/값은 항상 포인터로 전달됩니다. Tcl은 가능한 한 빨리 액세스하고 수정할 수있는 형식으로 데이터를 저장하기 위해 많은 노력을 기울이고 있습니다. 따라서 상위 레벨 뷰는 문자열 형식 규칙에 불과하지만 낮은 레벨에서는 실제로 문자열과 다르게 구현됩니다. 이렇게하면 tcl이 목록과 배열 및 숫자를 빠르게 처리 할 수 있습니다. 그러나 목록이나 배열 또는 숫자를 문자열로 처리하도록 tcl에게 명시 적으로 요청하면 tcl은 객체를 문자열로 구문 분석 한 다음 나중에 해당 문자열을 원시 객체 유형으로 다시 구문 분석합니다. 이것은 반짝임으로 알려져 있으며 많은 CPU 사이클을 소모합니다.
Tcl은 또한 후드에서 수정시 쓰기를 구현합니다. 따라서 목록이나 문자열의 전체 복사본을 반환해도 실제로 개체의 다른 복사본이 메모리에 만들어지지 않습니다. 복사본은 반환 값을 수정하려고하는 경우에만 만들어집니다.
두 번째 질문에 대한 답은 속도 (regexp, string first 등)에 신경 쓰면 문자열 명령으로 목록 배열을 처리하지 않는 것입니다. 목록 명령을 사용하여 목록을 처리하고 문자열 명령을 처리하여 문자열을 처리합니다. 당신이 그것을 피할 수없는 경우가 있는데, 문자열 명령이 더 쉽고 속도가 중요하지 않지만 일반적으로 반짝이는 것을 피하려고하는 경우가 있습니다. 습득하는 습관이 좋습니다.
위와 같이 목록을 수정하는 가장 효율적인 방법은 배열에서 목록 명령 (lset
, lrange
등)을 사용하는 것입니다.예를 들어 배열 "foo"의 "bar"목록에서 두 번째 요소를 수정하려면 다음을 수행하십시오.
lset foo(bar) 1 "new value"
- 1. 어떻게 배열에서 배열을 반환합니까?
- 2. 참조 데이터 형식의 앰퍼샌드는 참조 자체의 주소 또는 참조하는 값을 반환합니까?
- 3. Possibilites @mysql_affected_rows가 값을 반환합니까?
- 4. XSD에서 자동 생성 된 클래스는 배열에서 같은 값을 모두 반환합니까?
- 5. 문자열을 배열과 비교 한 다음 두 번째 배열에서 값을 반환합니까?
- 6. 파이썬은 잘못된 값을 반환합니까?
- 7. 배열에서 인덱스와 값을 반환
- 8. 어떻게 올바른 값을 반환합니까?
- 9. Google 애플리케이션 엔진의 "memcache.get()"이 참조 또는 전체 복사본을 반환합니까?
- 10. Symfony2 Service Container - get()은 참조 또는 복사하여 객체를 반환합니까?
- 11. 클래스의 생성자가 클래스 형식의 참조 또는 메모리 조각을 반환합니까?
- 12. 어떻게 GUI에서 값을 반환합니까?
- 13. BackgroundWorker는 값을 반환합니까?
- 14. 쿼리는 toString() 값을 반환합니까?
- 15. cos가 잘못된 값을 반환합니까?
- 16. 이상한 값을 반환하는 포인터의 참조
- 17. 생성시 배열에서 색인 참조 (PHP)
- 18. 배열에서 구조체 참조 구문 분석
- 19. getGsmSignalStrength() 범위를 벗어난 값을 반환합니까?
- 20. 줄리아 함수에서 : 참조 또는 값을 전달합니까?
- 21. 문자열 비교는 언제 참조 또는 값을 비교합니까?
- 22. STL : 참조 또는 값을 저장 하시겠습니까?
- 23. 튜플에 const 참조 또는 const 값을 넣음
- 24. 어떻게 함수를 반환합니까 true 또는 false 이상을 반환합니까?
- 25. Java : void 메서드가 값을 반환합니까?
- 26. 배열에서 값을 얻는 방법
- 27. 개체 참조 또는 참조?
- 28. 배열에서 참조 된 객체의 위치?
- 29. Perl의 해시 배열에서 역 참조? 다음
- 30. C++에서 참조가 왼쪽 값 또는 오른쪽 값을 반환합니까?
감사합니다. 나보다 훨씬 더 많은 사람들에게 도움이 될 것입니다. – Dronacharya
다음과 같은 작은 스크립트를 작성했습니다 :'array set ma [list f] first [s] [list "sec" "ond"]] puts ma (f) ma (s)'를 실행하면'ma (f) ma (s) '가 인쇄됩니다. 내가 뭘 잘못하고있어, 나에게 말해 줄 수 있니? – Dronacharya
엄밀히 말하면, Tcl에는 *** 불변의 *** 참조 의미가 있습니다 (참조 루프가 없음이 보장됨). Tcl 코드의 관점에서 보면, 더 빠르다는 것을 제외하고는 값 의미와 같습니다. –