问题描述
|
更新资料
忽略以下内容。原来这是一个仅限于Macruby 0.10的错误,可能是我安装的错误。如果有人遇到问题,我将离开该职位。
我似乎对红宝石块有误解。我想使用
Pathname
或Find
模块的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
不能像第一个示例那样工作?
更一般而言,在这种情况下,我是否使用正确的红宝石技术/习惯用法?
解决方法
似乎在OSX和JRuby-1.6.1上使用ѭ8可以在ruby-1.8.7-p334(MRI)上工作。
,
Enumerable#find
将在块返回\“ not false \”时执行自己的循环终止,因此:
pd.find { |p| p.basename.to_s == file_name_I_want_to_find }
不管您的构造是否有效(似乎),您实际上都不知道哪种方法最终会导致对该块的控制,因此我认为可能很难使用break并继续在核心API元素上强制行为。我怀疑它们用作块控制流表达式的主要目的是在实现中,而不是在API边界上。
因此,“否”,那并不是最好的Ruby惯用语。您应该直接使用API。您尝试做的所有事情都有直接的核心API(以及某种功能)实现,而无需构造自己的命令性实现。