루비의 대장 연산자는 무엇입니까?
내가 말할 때{ :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 => bar
foo는 상징이 될 것입니다.기호의 이점은 고유하다는 것입니다.해시에 있는 항목을 호출할 때는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
'IT' 카테고리의 다른 글
Swift perform Selector:withObject:afterDelay:는 사용할 수 없습니다. (0) | 2023.06.02 |
---|---|
PL/pgSQL을 사용하여 쿼리 결과를 변수에 저장 (0) | 2023.06.02 |
반복하는 동안 값 변경 (0) | 2023.06.02 |
배열에 다른 배열의 값이 포함되어 있습니까? (0) | 2023.06.02 |
루비에서 해시를 복사하려면 어떻게 해야 합니까? (0) | 2023.06.02 |