2014-01-08 5 views
1

Ruby를 처음 배우는 중입니다. 조합 된 비교 연산자 (또는 우주선 연산자)를 사용하여 연산자 앞에 배치 된 명령문이 실행되지만 나중에 배치되는 명령문은 오류를 일으킬 것이라는 것을 블록문 내부에서 발견했습니다. 나는 세미콜론으로 노는 것으로 이것을 발견했다.블록 문에서 그 뒤에 뭔가가있을 때 조합 된 비교가 실패하는 이유는 무엇입니까?

list.sort { |item1, item2| puts "foo"; item1 <=> item2 } 작동하지만

list.sort { |item1, item2| item1 <=> item2; puts "foo" }이 실패합니다.

차단 문 외부에서 시도했지만 문제가 사라졌습니다. 그런 다음 여러 줄로 된 블록 명령문 (예 :

list.sort do |item1, item2| 
    item1 <=> item2 
    puts "foo" 
end 

)을 시도했으며 단일 행 블록과 동일한 문제가 있습니다.

무슨 일이 일어나는지 아는 사람이 있습니까?

가장 좋은 설명은 < => splat와 같은 매개 변수 기능을 사용하고 항목 2 이후의 텍스트를 빨아들이지만 차단 문에서 발생하지만 왜 외부에서 발생하지 않는지는 알 수 없습니다. 하나 또는 세미콜론과 개행 문자를 무시하는 이유. 간단한 검색은 유용한 문서를 찾지 못했습니다.

편집 : Codeacadamy.com의 컴파일러를 사용할 때 "String with String with string failed"오류가 발생합니다.

Edit2가 :

ruby -e ' 
> list = ["one", "two", "three"] 
> list.sort { |f, s| f <=> s; puts "foo" } 
> puts list 
> ' 
foo 
-e:3:in `sort': comparison of String with String failed (ArgumentError) 
from -e:3:in `<main>' 
+0

어떤 오류가 있습니까? 당신이 말했듯이 그것은 실패합니다. 우리는 당신의 샘플 데이터를 볼 필요가 있습니다. –

답변

2

이 수행 할 때

list.sort do |item1, item2| 
    item1 <=> item2 
    puts "foo" 
end 

루비 의 반환 값의 비교를 결정하는 블록에 보이는합니다. 블록 마지막에 puts "foo"이 있으므로 사용자 정의 비교의 결과는 puts "foo" (즉 nil)의 출력이됩니다. 비교기를 블록에서 마지막으로 수행하기를 원합니다.

+0

감사합니다. 나는 return 문이 없다면 루비가 마지막으로 평가 된 표현식을 리턴한다는 것을 잊었다. –