2017-10-23 8 views
1

누군가 다음 코드가 어떻게 작동하는지 설명 할 수 있습니까? 상태를 검사 할 때`` "<" "b"`는 왜``true '입니까?

"a" < "b" #=> true 
"a" > "b" #=> false 
"a" < "B" #=> false 
"A" < "B" #=> true 
"A" < "b" #=> true 
"A" < "z" #=> true 
"z" < "A" 
+1

보다 당신 __did__ 어떤 결과를 기대하는 이유 당신이 볼 수 있습니까? –

+0

이 코드의 작동 방식을 알고 싶습니다. 왜 "" ""B "'true가 될 수 없습니까? –

+0

"다음 코드의 작동 방식을 모릅니다"- [Comparable # <]] (https://ruby-doc.org/core-2.2.3/Comparable.html#method-i-3C)이며, 연산자 '<=>'(루비의 비교 연산자)로 구현됩니다. 그리고 현은 그들 중 어느 것이 다른 것보다 "작다"는 것을 압니다. –

답변

3

지금까지 내 지점을 가지고 희망입니다 알 수 있듯이 표준 RubyRubinius은 문자열이 메모리에 저장 될 때 문자열을 비교합니다.

와 C-루비에서

:

retval = memcmp(ptr1, ptr2, lesser(len1, len2)) 

과와 Rubinius의 :

@data.compare_bytes(other.__data__, @num_bytes, other.bytesize) 

몇 가지 추가 검사가 있습니다 (예를 들어 other 또한 문자열의 경우, 또는 인코딩이 호환되는 경우)하지만, "a""b"을 비교할 때 Ruby는 기본적으로 "a".bytes"b".bytes을 비교합니다.

String#bytes은 정수 배열을 반환합니다. 루비에서 배열은 기본적으로 비교할 수 없습니다, 그래서 당신은 콘솔에서 "a".bytes < "b".bytes로 재생하기 전에

class Array 
    include Comparable 
end 

을 시작할 수 있습니다.

문자열은 lexicographical order에 따라 비교됩니다. 일례로서

는 :

class Array; include Comparable; end 

p "a".bytes 
# [97] 
p "b".bytes 
# [98] 
p "a".bytes < "b".bytes 
# true 
p "a" < "b" 
# true 
p "B".bytes 
# [66] 
p "a".bytes < "B".bytes 
# false 

ASCII 문자열을 비교하는 것이 @AniketShivamTiwari 의해 제공된 설명을 맞는다.

마지막으로,이 동작은 루비에만 국한되지 않습니다. Linux 폴더에서 대문자 파일 이름은 소문자보다 먼저 정렬됩니다 (적어도 LC_COLLATE="C" 일 때).

+0

매우 멋지게 설명했습니다. –

4

그것의 기본적으로는 ASCII 코드로 변환 된 후 result.Here을 비교 link

"a" < "b" 
    => true 
    When it converts so a = 97 & b = 98 In ASCII 
    And 97 < 98 which is true 

    "a" > "b" 
    => false 
    When it converts so a = 97 & b = 98 In ASCII 
    And 97 > 98 which is false 

    "a" < "B" 
    => false 
    When it converts so a = 97 & B = 66 In ASCII 
    And 97 < 66 which is false 

    "A" < "B" 
    => true 
    When it converts so A = 65 & B = 66 In ASCII 
    And 65 < 66 which is true 

    "A" < "b" 
    => true 
    When it converts so A = 65 & b = 98 In ASCII 
    And 65 < 98 which is true 

난 당신이 I로

+0

형식을 수정하여 비 코드가 코드 블록에 없도록하십시오. :) –

+5

이것은 일반적으로 잘못되었습니다. 루비 -e는 "я"<=> "ф" ''결과를 [proper]'1'로 만들고,'я'이나'ф'는 ASCII 코드를 전혀 갖지 않습니다. – mudasobwa

+0

@ mudasobwa- 여기에서 확인할 수 있습니다. http://www.addressmunger.com/hex_ascii_tables/. "я"는 "ф"보다 더 큰 가치를 지니고 있습니다. 1 –

0

문자의 바이트 값을 비교 한 것입니다. 당신은 bytes 방법으로 문자의 원시 바이트 값을 볼 수 있습니다

'B'.bytes 
=> [66] 

'a'.bytes 
=> [97] 

을 이제 'B''a'

+0

작성하기 전에 다른 답변을 살펴 보았습니까? –

+0

@EricDuminil 사과, 다른 답은 'byte'값 비교라는 것을 분명하게 설명하지 않았고 간결한 예를 들었다. ASCII 값을 언급하면 ​​특히 유니 코드 문자가있는 비교를 처리 할 때 물이 흐릿해질 수 있습니다. – ddubs

+0

제 답변을 다시 읽으십시오. 특히'bytes'에 대해서 언급합니다. 당신의 대답에 새로운 정보가 보이지 않습니다. –

관련 문제