[ruby] 루비에서 콜론 연산자는 무엇입니까?

내가 말할 때 { :bla => 1, :bloop => 2 }정확히 무엇을 :합니까? 문자열과 어떻게 비슷한 지, 어떻게 든 기호에 대해 읽었습니다.

나는 그 개념에 대해 명확하지 않다. 누군가 나를 밝힐 수 있을까?



답변

:foo“foo”라는 기호입니다. 기호에는 동일한 이름의 두 기호가 동일하다는 특징이 있습니다.

"foo".equal? "foo"  # false
:foo.equal? :foo    # true

이렇게하면 두 기호를 정말 빠르게 비교할 수 있습니다 (문자열에서와 같은 모든 문자를 비교하는 것과는 반대로 포인터 비교 만 포함되기 때문에). 동일한 기호의 부동 복사본이 떠 있지 않습니다.

또한 문자열과 달리 기호는 변경할 수 없습니다.


답변

답변에 언급 된 것들 중 일부를 보여주기 위해 :

require 'benchmark'

n = 1_000_000

print '"foo".equal? "foo" -> ', ("foo".equal? "foo"), "\n"
print '"foo" == "foo"     -> ', ("foo" == "foo"    ), "\n"
print ':foo.equal? :foo   -> ', (:foo.equal? :foo  ), "\n"
print ':foo == :foo       -> ', (:foo == :foo      ), "\n"

Benchmark.bm(10) do |b|
  b.report('string')     { n.times { "foo".equal? "foo" }}
  b.report('str == str') { n.times { "foo" == "foo"     }}
  b.report('symbol')     { n.times { :foo.equal? :foo   }}
  b.report('sym == sym') { n.times { :foo == :foo       }}
end

실행하면 다음이 출력됩니다.

"foo".equal? "foo" -> false
"foo" == "foo"     -> true
:foo.equal? :foo   -> true
:foo == :foo       -> true

따라서 문자열 equal?이 내용이 같더라도 다른 객체이므로 문자열을 사용하여 문자열을 비교하는 데 실패합니다. ==내용을 비교하고 기호와 동등한 검사가 훨씬 빠릅니다.

                 user     system      total        real
string       0.370000   0.000000   0.370000 (  0.371700)
str == str   0.330000   0.000000   0.330000 (  0.326368)
symbol       0.170000   0.000000   0.170000 (  0.174641)
sym == sym   0.180000   0.000000   0.180000 (  0.179374)

두 가지 심볼 테스트는 기본적으로 속도와 동일합니다. 1,000,000 회 반복 한 후에는 0.004733 초의 차이 만 있으므로 사용할 때 씻어야한다고 말하고 싶습니다.


답변

기호는 루비로 문자열과 이름을 나타내는 방법입니다.

심볼과 문자열의 주요 차이점은 동일한 이름의 심볼이 초기화되고 루비 세션 동안 메모리에 한 번만 존재한다는 것입니다.

서로 다른 것을 표현하기 위해 같은 단어를 사용해야 할 때 유용합니다


답변

유명한 책 Agile Web Development with Rails의 인용문이 있는데 ,이 심볼 을 이해하는 데 도움이 될 수 있습니다 .

Rails는 기호를 사용하여 사물을 식별합니다. 특히 메소드 매개 변수의 이름을 지정하고 해시에서 물건을 찾을 때 키로 사용합니다.

redirect_to :action => "edit", :id => params[:id]

기호를 마술처럼 상수로 만드는 문자열 리터럴로 생각할 수 있습니다. 또는 콜론을 “이름이 지정된 것”으로 간주 할 수 있으므로 : id는 “이름이 지정된 것”입니다.


답변

루비에서 각 객체에는 고유 한 객체 식별자 puts "hello".object_id가 있습니다. irb에 쓰고 두 번 다른 시간 동안 리턴을 누르면 2 개의 다른 리턴 값을 얻게되지만 :hello.object_id2 번 쓰면 동일한 하나의 리턴 값 만 얻게됩니다. 그 차이점을 설명해야합니다.


답변

을 사용 :foo => bar하면 foo가 기호가됩니다. 심볼의 장점은 고유하다는 것입니다. 해시에서 항목을 호출하면 hash[:foo]됩니다.

기호는 문자열보다 적은 메모리를 필요로하므로 프로그램을 좀 더 빠르게 만들고 싶을 때 유용합니다.


답변

상징입니다. 기본적으로, 당신은 해시의 두 가지 요소가 키를 가지고 말을 bla하고 bloop당신이 문자열을 사용했다 많은 것처럼, "bla"하고 "bloop". 그러나 문자열보다 적은 메모리를 차지하며 입력하기가 더 쉽습니다.