저는 Ruby 세계에 완전히 익숙하지 않으며 Symbols 개념과 약간 혼동됩니다. 기호와 변수의 차이점은 무엇입니까? 변수를 사용하지 않는 이유는 무엇입니까?
감사합니다.
댓글
- in Lisp -Ruby가 파생 된 것-심볼은 본질적으로 변수의 데이터 유형입니다. 즉, 프로그램이 실행될 때 Reflection-esque 방식으로 프로그램을 조작 할 수 있습니다. (가장 일관된 설명이 아닙니다. 죄송합니다)
답변
변수와 기호는 서로 다릅니다. 변수는 서로 다른 종류의 데이터를 가리 킵니다. Ruby에서는 심볼은 변수 라기보다 문자열과 비슷합니다.
루비에서 문자열은 변경 가능하지만 심볼은 변경 불가능합니다. 즉, 심볼의 복사본을 하나만 생성하면됩니다. have
x = :my_str y = :my_str
:my_str
는 한 번만 생성되며 x
및 y
는 동일한 메모리 영역을 가리 킵니다. 반면에
x = "my_str" y = "my_str"
a 문자열 포함 my_str
는 두 번 , x
및 y
는 다른 인스턴스를 가리 킵니다.
결과적으로 기호는 종종 Ruby의 열거 형과 동등하게 사용되며 사전 (해시)에 대한 키로 사용됩니다.
Comments
- @mipadi '의 포인트를 푸시하기 만하면 문자열을 비교할 때 모든 문자를 서로 비교해야합니다. 따라서 동일한 문자열을 비교하는 것은 O (n)입니다. 루비 기호가 객체 참조를 비교하는 반면 마녀는 O (1)입니다.
- 파이썬에는 왜이 기능이 없나요?
- 마지막으로 알고 있었기 때문에 이러한 기호를 남용하지 않도록주의해야합니다. 하지만 저는 ' 루비 > 1.9에서 이것을 조사하지 않았고 기호는 ' t get gc ' d이므로 메모리를 소모 할 수 있습니다.
-
#mySymbol
와 같은 모습을 제외하고 Smalltalk에서 동일하게 작동합니다. . - @ frogstarr78-프로그래밍 방식으로 기호를 생성하지 않는 한 (먼저 확인하지 않고 문자열을 인터 닝) 너무 많은 기호를 만드는 것에 대해 걱정할 필요가 없습니다. '
답변
루비의 기호는 기본적으로 실제 세계의 기호와 동일합니다. 무언가를 나타내거나 이름을 지정하는 데 사용됩니다.
기호는 일종의 상태를 나타내는 데 매우 일반적으로 사용됩니다. 예를 들어
order.status = :canceled order.status = :confirmed
당신 기호를 인스턴트 열거 형으로 볼 수도 있습니다. 기호를 정의 할 필요가 없습니다. 사용하기 만하면됩니다. 이 도움말에서는 자세한 내용을 설명합니다.
댓글
- 지금까지 보았던 대부분의 '보다 더 나은 설명입니다.
답변
보통 변수는 문자열과 혼동되는 경향이 있지만 변수처럼 생각하는 것은 이해할 수 있습니다. 다음과 같이 생각해보십시오.
게임에서 플레이어의 상태는 숫자로 표시됩니다. 1은 살아 있음을, 2는 확실하지 않음, 3은 죽었 음을 의미합니다. 이것은 기호로 쉽게 대체 될 수 있습니다. 기호는 :alive
:unsure
및 :dead
일 수 있습니다. 플레이어가 살아 있는지 확인하려면 다음을 수행하는 대신 :
if player_status == 1
다음을 수행 할 수 있습니다.
if player_status == :alive