2015-04-19 122 views
0

正如在「Alphabetize results of Dir.glob」,我用sort獲得按字母順序排列的文件列表:Dir.glob與排序問題

Dir.glob("#{options[:path]}/**/*.jpg", File::FNM_CASEFOLD).sort { |file| 

    dir, filename = file.match(/.+\/(.+)\/(.+)/).captures 

    # ---cut--- 

} 

沒有它的工作好了sort,但它失敗,錯誤:

$ rake slides:import -- --user foo --path /bar/baz 
(in /home/user/app_folder) 
"baz/ - /bar/baz/DSC_4120.JPG - saved" 
rake aborted! 
ArgumentError: comparison of String with 0 failed 
/home/footoo/footoo/lib/tasks/slides.rake:41:in `>' 
/home/footoo/footoo/lib/tasks/slides.rake:41:in `sort' 
/home/footoo/footoo/lib/tasks/slides.rake:41:in `block (2 levels) in <top (required)>' 
/usr/local/rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `eval' 
/usr/local/rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `<main>' 
Tasks: TOP => slides:import 

任何想法有什麼不對?

Full code on Github

+0

不要說「這個問題的答案」,而不是使用錨文本是更具描述。 –

回答

3

當給出排序塊時,它希望它返回-1,0或1以知道如何排序(自定義<=>函數)。您需要在排序後添加each以恢復默認排序和預期行爲。

Dir.glob("#{options[:path]}/**/*.jpg", File::FNM_CASEFOLD).sort.each{|file| 
.... 
} 

在這裏閱讀的文檔:http://ruby-doc.org/core-2.2.0/Array.html#method-i-sort

+0

爲了詳細說明一下,'sort'的塊傳遞了一個包含兩個被排序對象的2元素數組,並且這個數組被分配給了塊變量,所以這裏'file'等於'[file1,file2 ]'。這就是爲什麼你通常將數組看作兩個塊變量:'... sort {| file1,file2 | ...}'。 –