Обновлять
Игнорируйте следующее. Оказалось, что это ошибка, ограниченная Macruby 0.10 и, вероятно, специфичная для моей установки. Я покину пост на случай, если кто-то еще столкнется с проблемой.
Кажется, я что-то неправильно понял о рубиновых блоках. Я хотел использовать find
модуля Pathname
или Find
для поиска определенного файла в определенном дереве каталогов. Однако я не могу заставить блок, предоставленный find
, возвращать какое-либо значение.
Поскольку это:
n= (1..10).each {|i| break i if i > 5}
puts "n = #{n}" #=> n=6
... работает (и является общей конструкцией) Я ожидал, что либо:
starting_directory= #... a directory path
file_name_I_want_to_find= #... a file name e.g. my_file.txt
pd=Pathname.new(starting_directory)
path=pd.find{|p| break p if p.basename.to_s==file_name_I_want_to_find }
puts "path = #{path}" #=> path =
... or:
path=Find.find(starting_directory) {|p| break p if p.include?(file_name_I_want_to_find) }
puts "path = #{path}" #=> path =
... будет производить только один искомый путь, но ни один из них не дает никакого значения.
Я знаю, что мой тест работает, потому что оба из следующих:
pd.find{|p| puts p if p.basename.to_s==file_name_I_want_to_find }
#=> /path/to/file_name_I_want_to_find
Find.find(starting_directory) {|p| puts p if p.include?(file_name_I_want_to_find) }
#=> /path/to/file_name_I_want_to_find
... работают как положено.
Почему break
с find
не работает так, как в первом примере?
В более общем плане, использую ли я правильную рубиновую технику/идиому для этого обстоятельства?