Ruby 문자열 또는 기호에 대해 문자열 동등성을 테스트하는 가장 간결한 방법 (객체 동등성이 아님)?


88

저는 항상 Ruby에서 문자열 동등성을 테스트하기 위해 이렇게합니다.

if mystring.eql?(yourstring)
 puts "same"
else
 puts "different"
end

이것이 객체 동등성을 테스트하지 않고이를 수행하는 올바른 방법입니까?

콘텐츠를 기반으로 문자열을 테스트하는 가장 간결한 방법을 찾고 있습니다.

괄호와 물음표가 있으면 조금 어색해 보입니다.

답변:



15

코드 샘플은 주제의 일부, 즉 기호로 확장되지 않았으므로 질문의 해당 부분에 대한 답변이 없습니다.

두 개의 문자열, foo 및 bar가 있고 둘 다 문자열 또는 기호 일 수있는 경우 다음을 사용하여 동등성을 테스트 할 수 있습니다.

foo.to_s == bar.to_s

알려진 유형의 피연산자에 대한 문자열 변환을 건너 뛰는 것이 좀 더 효율적입니다. 따라서 foo가 항상 문자열이면

foo == bar.to_s

그러나 효율성 향상은 호출자를 대신하여 추가 작업을 요구할 가치가 거의 없습니다.

Ruby 2.2 이전에는 기호가 가비지 수집되지 않고 리소스 고갈을 통해 서비스 거부에 노출 될 수 있으므로 비교 (문자열 또는 기호 사용)를 위해 제어되지 않은 입력 문자열을 삽입하지 마십시오. 기호의 사용을 제어하는 ​​값 (예 : 코드의 리터럴 및 신뢰할 수있는 구성 속성)으로 제한합니다.

Ruby 2.2 는 심볼의 가비지 컬렉션을 도입했습니다 .


6
foo.intern == bar.intern더 낫습니다. 문자열을 인터 닝하는 것이 기호에서 문자열을 만드는 것보다 평균적으로 더 효율적입니다. (주어진 문자열이 이전에 인턴 된 경우 기호를 반환합니다.)
Chuck

4
실제로 문자열이 일치하지 않으면 기호가 누출되므로 일부 비교에서 약간의 절약을 위해 문자열에서 기호를 만드는 것은 좋은 생각이 아니라고 생각합니다. 심볼은 가비지 수집되지 않으므로 유지하지 않으려면 생성해서는 안됩니다. 그렇지 않으면 서비스 거부 공격에 대한 벡터를 생성합니다.
Patru 2013-08-13

이런, 나는 그것을 생각하지 않았다. 감사합니다. 귀하의 의견에 따라 답변을 수정했습니다.
sheldonh

1
"기호가 가비지 수집되지 않으므로 제어되지 않은 입력 문자열 [...]을 삽입하지 마십시오"라는 내용을 다시 설명해야합니다. @sheldonh 감사합니다.
Nate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.