2009-03-18 1 views

답변

7

기호로 보는 것은 거의 항상 리터럴을 통해 만들어 지므로 여기에는 메모리 폭발 가능성이별로 없습니다. 그들의 행동은 그들의 사용법에 의해 요구된다 : 당신이 상징을 참조 할 때마다, 그것은 동일한 것이다.

마찬가지로 문자열은 Ruby에서 고유해야합니다. 이것은 사용 된 방식 (텍스트 처리 등) 때문입니다.

의미에 따라 사용할 것을 결정하십시오. 조기에 최적화하지 마십시오. 당신이 당신의 루프에서 동일한 기호를 참조하면

8

, 그것은 당신이 대신이 문자열을 사용하는 경우 지금

while i < 10000 
    i += 1 
    :im_using_this_symbol_here 
end 

즉, 그 객체 매번를 다시 할 필요가 없습니다, 문자열은 10K 번 다시 생성됩니다 . 일반적으로 상수 나 키와 같이 리터럴을 거의 다룰 때 심볼을 사용하십시오. 나에게 아주 좋은 예

link_to "News", "action" => 'news' 

작업은 응용 프로그램 내에서 또 다시 다시 사용

link_to "News", :action => 'news' 

대신 할 것이다.

+11

어림짐작을 추가 할 수 있습니다. 사용자가 입력 한 문자열을 절대로 Symbols로 변환 할 수 없습니다. 그것은 DOS 공격의 가능성을 열어 줄 것입니다. – Arsen7

6

Ruby 2.2.0 이상을 사용하는 경우 more details about the new symbol GC에 대한 링크가있는 Ruby 2.2.0-preview1 announcement에 따라 가비지 수집되므로 많은 기호를 동적으로 만드는 것이 좋습니다. 그러나 동적 심볼을 ID (C 소스 코드에서 사용되는 내부 루비 구현 개념)로 변환하는 일종의 코드에 전달하면이 경우 고정되어 쓰레기 수거가되지 않습니다. 얼마나 흔한 일인지 잘 모르겠습니다.

고려해야 기호 또는 문자열을 사용할지 여부를 결정 :

  • 기호를 변경할 수 없습니다 그들이 만든 후.
  • 기호에는 문자열과 같은 많은 메서드가 없습니다 (예 :
  • ). 기호를 서로 매우 동일하게 비교할 수 있습니다.
  • 기호는 Symbol docs에 따라 무언가의 이름을 나타냅니다. 나는 그들을 이름으로 생각할 수없는 것을 저장하는 데 사용하지 않을 것이다.
관련 문제