IT

루비의 대장 연산자는 무엇입니까?

itgroup 2023. 6. 2. 20:24
반응형

루비의 대장 연산자는 무엇입니까?

내가 말할 때{ :bla => 1, :bloop => 2 }정확히 무엇을 합니까?:그래요? 어디선가 끈과 비슷하다는 글을 읽었는데, 어쩐지 상징이더군요.

제가 개념을 잘 몰라서 그러는데, 누가 좀 가르쳐 주시겠어요?

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

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

따라서 두 개의 기호를 비교하는 속도가 매우 빠릅니다(문자열의 모든 문자를 비교하는 것과 달리 포인터 비교만 포함되므로). 또한 동일한 기호의 복사본이 10억 개도 표시되지 않습니다.

또한, 문자열과 달리, 기호는 불변입니다.

답변에 언급된 몇 가지 사항을 시연해 보겠습니다.

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)

두 기호 테스트는 속도에 관해서는 기본적으로 동일합니다.100만 번 반복하면 0.004733초밖에 차이가 나지 않기 때문에 어느 쪽을 사용해야 할지 결정해야 합니다.

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

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

그것들은 당신이 다른 것들을 나타내기 위해 같은 단어를 사용해야 할 때 유용합니다.

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

레일은 사물을 식별하기 위해 기호를 사용합니다.특히 메서드 매개 변수의 이름을 지정하고 해시에서 항목을 검색할 때 키로 사용합니다.

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

기호는 마법처럼 상수로 만들어진 문자열 리터럴이라고 생각할 수 있습니다.또는 콜론을 "이름이 지정된 항목"을 의미하는 것으로 간주할 수 있습니다. 따라서 :id는 "이름이 지정된 항목"입니다.

루비에서 각 개체는 고유한 개체 식별자를 가집니다.puts "hello".object_id당신의 irb와 히트 리턴에서 두 번, 당신은 두 번의 다른 리턴 값을 얻을 것이지만, 만약 당신이 쓴다면.:hello.object_id두 번만 같은 값만 반환됩니다.그것이 그 차이를 설명했어야 했습니다.

사용하는 경우:foo => barfoo는 상징이 될 것입니다.기호의 이점은 고유하다는 것입니다.해시에 있는 항목을 호출할 때는hash[:foo].

기호는 문자열보다 적은 메모리를 필요로 하므로 프로그램을 조금 더 빠르게 만들려는 경우에도 유용합니다.

이 모든 대답에는 감질나는 세부사항이 하나 빠져 있습니다.기호:foo를 문자열화하면..그거 알아요?현 "foo"이런 이유로

irb(main):025:0>
irb(main):026:0> :foo
=> :foo
irb(main):027:0> "#{:foo}"
=> "foo"
irb(main):028:0>
irb(main):029:0> 'foo' <=> :foo
=> nil
irb(main):030:0> 'foo' <=> :foo.to_s
=> 0
irb(main):031:0>

그러므로... Perl 프로그래머의 경우.'맨말'에 대한 루비의 대답입니다.

그것은 상징입니다.기본적으로, 당신은 해시의 두 요소가 키를 가지고 있다고 말하고 있습니다.bla그리고.bloop 문자열을 "bla"그리고."bloop"그러나 문자열보다 메모리를 덜 차지하고 타이핑하기가 쉽습니다.

Java에 익숙한 경우 Java의 문자열은 변경할 수 없습니다.루비의 기호는 그런 점에서 비슷합니다.그것들은 불변입니다. 즉, 특정 기호의 발생 횟수가 제한되지 않습니다.:symbol단일 메모리 주소에만 매핑됩니다.따라서 메모리 사용을 최적화하므로 가능한 한 기호를 사용하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/6337897/what-is-the-colon-operator-in-ruby

반응형