루비의 상징은 무엇입니까?


45

나는 루비 세계에 완전히 익숙하지 않고 심볼 개념과 약간 혼동된다. 기호와 변수의 차이점은 무엇입니까? 왜 변수를 사용하지 않습니까?

감사.


Lisp에서-Ruby가 파생 된-기호는 본질적 으로 변수의 데이터 유형입니다. 즉, 프로그램이 실행될 때 리플렉션과 같은 방식으로 프로그램을 조작 할 수 있습니다. (가장 일관된 설명이 아님, 죄송합니다)
Paul Nathan

답변:


70

변수와 기호는 다릅니다. 변수는 다른 종류의 데이터를 가리 킵니다. 루비에서 기호는 변수보다 문자열과 비슷합니다.

루비에서는 문자열을 변경할 수 있지만 기호는 변경할 수 없습니다. 즉, 하나의 심볼 사본 만 작성하면됩니다. 따라서

x = :my_str
y = :my_str

:my_str한 번만 생성 될 것입니다 xy지점 같은 메모리 영역. 반면에

x = "my_str"
y = "my_str"

포함하는 문자열이 my_str생성됩니다 두 번 하고, x그리고 y서로 다른 인스턴스를 가리 킵니다.

결과적으로 기호는 종종 루비의 열거 형과 같은 사전으로 사용되며 사전의 키 (해시)입니다.


1
@mipadi의 요점을 밀기 위해 문자열을 비교할 때 모든 문자를 서로 비교해야합니다. 따라서 동일한 문자열을 비교하는 것은 O (n)입니다. 루비 기호가 객체 참조를 비교하는 반면 마녀는 O (1)입니다.
Jeremy Heiler

왜 파이썬에 없는가?
Job

마지막으로 내가 알고 있기 때문에 당신은 또한 그들을 남용하지 않도록 조심해야한다,하지만 난 루비> 1.9이에보고하지 않은, 기호 gc'd되지 않는 등 메모리까지 먹을 수
frogstarr78

그들은처럼 보이는 것을 제외하고 Smalltalk에서 동일하게 동작합니다 #mySymbol.
Frank Shearar

@ frogstarr78-프로그래밍 방식으로 심볼을 생성하지 않는 한 (먼저 문자열을 확인하지 않고 문자열을 인계하지 않는 한) 너무 많은 심볼을 만들지 않아도됩니다.
저스틴 L.

16

루비의 기호는 기본적으로 실제 기호와 동일합니다. 그것은 무언가를 나타내거나 이름을 짓는데 사용됩니다.

기호는 예를 들어 어떤 종류의 상태를 나타내는 데 매우 일반적으로 사용됩니다.

order.status = :canceled
order.status = :confirmed

심볼을 인스턴트 열거 형으로 볼 수도 있습니다. 심볼을 정의 할 필요는 없으며 그냥 사용하면됩니다. 이 기사에서 자세히 설명합니다.


1
내가 지금까지 본 것보다 더 나은 설명.
Yuri Ghensev

0

일반적으로 변수는 문자열과 혼동되는 경향이 있지만 변수처럼 생각한다고 이해할 수 있습니다. 이해할 수 있습니다. 이런 식으로 생각하십시오 :

게임에서 플레이어의 상태는 숫자로 표시됩니다. 1은 살아 있음을, 2는 확실하지 않음을, 3은 죽었 음을 의미합니다. 이것은 쉽게 기호로 대체 될 수 있습니다. 기호는 :alive :unsure및 일 수 있습니다 :dead. 플레이어 대신 살아 있는지 확인하려면 :

if player_status == 1

당신은 이것을 할 수 있습니다 :

if player_status == :alive

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