2016-12-20 11 views
8

Dir.glob("*.txt") {|f| p f}은 파일 이름을 인쇄합니다.Dir.glob ("*. txt"). sort도 왜 필요합니까?

Dir.glob("*.txt").sort {|f| p f}이 ArgumentError와 함께 실패합니다.

Dir.glob("*.txt").sort.each {|f| p f}은 알파벳순으로 파일 이름을 인쇄합니다.

왜 두 번째 오류가 발생합니까? 더 나은 아직, .each 유무에 관계없이 첫 번째 이유는 무엇입니까?

  • Dir.globDir.glob.sort은 모두 배열입니다.
  • Dir.glob.methods == Dir.glob.sort.methods.

은 (Alphabetize results of Dir.glob에 의해 영감을. Dir.glob with sort issue의 아니 중복은 "세 번째는"이미 하나의 문제는. 것을 대답 때문에) sort {|f| p f} 정말 이해가되지 않기 때문에

+0

정렬 문제가있는 Dir.glob (http://stackoverflow.com/questions/29733611/dir-glob-with-sort-issue) –

답변

4

다른 대답은 정확하지만 나는 깊은 설명이 있다고 생각 : 또는 당신이 원하는 경우에 당신은 어휘 오름차순으로 일을 정렬에 블록을 생략 할 수있다. Dir.glob("*.txt") {|f| p f}과 같은 메서드 호출 후 블록이 있으면 블록은 메서드에 대한 선택적 인수입니다. Dir.glob의 정의에는 블록을 실행하는 yield 문이 있습니다.

Dir.glob("*.txt").sort {|f| p f}과 같이 메서드를 연결하면 블록이 glob 메서드 대신 sort 메서드에 대한 인수가됩니다. sort도 비교를 정의하기 위해 블록을 사용할 수 있지만이 블록은 해당 상황에서 의미가 없습니다. Dir.glob("*.txt").sort.each {|f| p f} 얻을 each 체이닝

블록 glob는 (각 인자에 대한 블록 실행)하는 것처럼 그것을 사용 each 방법에 인수한다.

+1

그래서'Dir.glob.each'와'Dir.glob'가 같은 종류의 블록을 허용한다는 것은 우연의 일치입니다. 그것이 ".each"의 유무에 관계없이 "Dir.glob {}"이 작동하는 이유입니다. 감사! –

+0

@CamilleGoudeseune'.each'는 전달 된 객체의 반환 값을 가지므로'glob'에서받은 응답을 반환합니다. 이것이 사실이 아니라는 유일한 경우는'each' 내부에서 돌연변이 방법을 사용하는 것입니다 – engineersmnky

5

두 번째는 실패합니다. sort과 함께 사용하는 블록은 이 str을 반환하기 때문에 "return -1, 0, or +1"이고 두 개의 인수 (비교할 요소)를 사용하지만 블록은 하나의 인수를 취하여 해당 인수를 반환합니다.

sort { |a, b| a <=> b } 

그렇게 .sort.each 완벽 의미가 있습니다 : sort의 기본 비교기 블록이 말에 해당하기 때문에

세 번째는 괜찮습니다.

당신은 두 번째 예에서 sort 예상하는 그 블록의 종류를 사용하는 경우 :

Dir.glob("*.txt").sort {|a, b| a <=> b } 

다음 일이 더 잘 작동합니다

을.

Dir.glob('*.txt').sort 
+0

의 가능한 복제본은 sort_by가 1.9.3에서 작동합니까? –

+1

@ sagarpandya82 분명히 [그것은] (http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-sort_by) OP가 혼란스럽지 않으면 '(두 개의 인수 블록 사용) 및'sort_by' (한 개의 인수 블록 사용). –

+0

아하. 그래서 정렬 {}은 .each {} 또는 .glob {}와 다른 의미입니다. 그럼에도 불구하고 왜 비대칭 성 : 왜 .glob에는 각각의 것이 필요하지 않습니까? (심지어 의미있는 질문입니까?) –