Ruby:突破内联块

问题描述

| 更新资料 忽略以下内容。原来这是一个仅限于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(以及某种功能)实现,而无需构造自己的命令性实现。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...