Ruby:从内联块中断 更新

Ruby:从内联块中断 更新,ruby,block,break,macruby,pathname,Ruby,Block,Break,Macruby,Pathname,忽略以下内容。这是一个局限于Macruby 0.10的bug,可能是我安装的特定bug。我会离开岗位,以防有人碰到这个问题 我似乎对ruby块有些误解。我想使用Pathname或Find模块的Find来定位特定目录树中的特定文件。但是,我无法获取提供给find的块以返回任何值 鉴于此: n= (1..10).each {|i| break i if i > 5} puts "n = #{n}" #=> n=6 。。。工程(并且是一种常见的施工)我希望: starting_dir

忽略以下内容。这是一个局限于Macruby 0.10的bug,可能是我安装的特定bug。我会离开岗位,以防有人碰到这个问题


我似乎对ruby块有些误解。我想使用
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
。。。按预期工作

为什么
不能像第一个示例中那样使用
find
中断

更一般地说,在这种情况下,我是否使用了正确的ruby技术/习惯用法

Enumerable#find
将在块返回“not false”时自行终止循环,因此:

不管您的构造是否实际工作(看起来),您实际上不知道哪种方法最终将控制权让给了块,因此我认为可能很难使用break并继续强制核心API元素的行为。我怀疑它们作为块控制流表达式的用途主要是在实现中,而不是在API边界上


所以,“不”,这并不是最好的Ruby习惯用法。您应该直接使用API。您尝试做的每件事都有一个直接的核心API(和某种功能)实现,而无需构建您自己的命令式实现。

似乎在OSX上的ruby-1.8.7-p334(MRI)上使用
break
是可行的,以及JRuby-1.6.1。

它适用于我在windows上的ruby 1.8.7和1.9.2。我在OSX上的ruby-1.8.7-p334上也适用于breaking。@xinit--谢谢,我没想到检查ruby版本的问题。我在macruby下运行脚本,macruby似乎是原因。如果你提出一个问题,我会接受。如果你愿意,你可以结束你的问题。@edgerunner--我可能会,但我想让xinit得到一些当之无愧的代表。结果证明,这只是Macruby 0.10的一个bug,
pd.find { |p| p.basename.to_s == file_name_I_want_to_find }