2017-05-03 29 views
-1

Ruby에서 문자열을 뒤집을 수있는 두 가지 솔루션이 있습니다. 하나는 사실을 인쇄하고 다른 하나는 거짓을 인쇄하지만, 둘 다 내가 원하는 응답을 인쇄합니다.다른 인쇄물이 틀리면 한 솔루션이 사실을 인쇄하는 이유는 무엇입니까?

사실로 인쇄되는 해결책과 동일한 대답이 발생한다고해도 왜 틀리다고 말합니까?

def reverse(string) 
new = "" 
    i = 0 
    length = string.length 
    while i < length do 
    new = new.to_s + string[-1, 1].to_s 
    string.chop! 
    if i >= string.length 
     break 
    end 
    end 
    puts new 
end 

def secondreverse(string) 
    new = "" 
    i = 0 
    length = string.length 
    while i < length do 
    new = string[i] + new 
    i += 1 
    end 
    return new 
end 

이 코드가 작동하는지 확인하는 테스트는 다음과 같습니다

는 솔루션 및 테스트입니다. 솔루션을 작성한 후에는 모두 사실을 인쇄해야합니다. 그냥 new을 반환해야 할 때 #reverse 기능에

puts("\nTests for #reverse") 
puts("===============================================") 
    puts(
     'secondreverse("abc") == "cba": ' + (secondreverse("abc") == "cba").to_s 
    ) 
    puts(
     'secondreverse("a") == "a": ' + (secondreverse("a") == "a").to_s 
    ) 
    puts(
     'secondreverse("") == "": ' + (secondreverse("") == "").to_s 
    ) 
puts("===============================================") 
+0

반환 값은 모두 'true'입니다. 너는 무엇을 얻 느냐? –

+0

변수의 이름으로'new'를 사용하는 것은 정말 나쁜 생각입니다. 결국 미래의 자신을 포함하여 코드를 다루는 다른 사람을 혼란스럽게 할 것입니다. 일반적으로'new_str' 나 유비쿼터스'retval'과 같은 더 기술적 인 이름을 사용하십시오. 또한 new.to_s + string [-1, 1] .to_s'는 여분의 문자열에 CPU 시간을 낭비하는 두 개의'to_s '를 사용하고 있습니다. 'string [-1, 1]'은 어색하다. 'string [-1]'도 똑같은 일을 할 것입니다. –

+0

또한주의하십시오. 첫 번째 방법은 전달 된 문자열을 무시하는 것입니다. 리터럴 문자열을 전달하는 것을 보지 못하지만 변수를 전달한 다음 나중에 확인하십시오. 결과적으로 이것이 의도적 인 것이라면 메소드 이름 끝에'!'를 사용해야합니다. –

답변

1

, 당신은 puts new를 반환한다.

는 아래의 예에서 볼 수 있듯이, 그것은 화면에 출력 한 후 전무 puts 반환 : 예상대로

irb(main): puts 'test' 
test 
=> nil 

당신이 puts new 단지 new을 변경하는 경우, 그것을 작동합니다.

을 제외하고

당신은 명시 적 return 전화를 사용할 필요가 없습니다.

return new 

로 :

new 
+0

감사! @the Tin Man 당신이 말하는 것을 보았습니다. 이제는 화면에 출력 된 후에 puts가 어떻게 반환되는지 잘 이해합니다. 또한 CPU 시간 코드를 단축하는 방법을 알려준 데 대해 감사드립니다. – jafoole

0

문제 reverse 방법, 당신은 가치를 인쇄하는 것을 당신이 두 가지 방법이 교체 할 수 있도록 루비에서 실행 된 마지막 라인은 반환됩니다 puts 메서드를 사용하여 stdout로 반환하지만 반환하지는 않습니다 (메서드가 nil을 대신 반환 함). nil == "cba"을 비교하면 false을 반환합니다. new 변수를 반환해야합니다.

def reverse(string) 
    new = "" 
    i = 0 
    length = string.length 
    while i < length do 
    new = new.to_s + string[-1, 1].to_s 
    string.chop! 
    if i >= string.length 
     break 
    end 
    end 
    new 
end