Обновление
Игнорировать следующее. Это оказалась ошибка, ограниченная 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 =
... или:
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
не работает так, как в первом примере?
В более общем смысле, я использую правильную технику / идиому рубина для этого обстоятельства?