-
请大家帮忙看看嵌套程序能否调用block5
定义:
def trave_path path, *args
if File.directory? path
Dir.foreach(path) { |p| trave_path path + "/" + p, *args unless p =~ /^\./ }
else
yield path, *args
end
end
调用('6124000'是目录,下面还包含目录,然后才是文件):
trave_path("61240000") do |pa|
p pa
end
报错:
D:/Program Files/Ruby1.86/Ruby/lib/lbc/Path.rb:6:in `trave_path': no block give
(LocalJumpError)
from D:/Program Files/Ruby1.86/Ruby/lib/lbc/Path.rb:4:in `trave_path'
from D:/Program Files/Ruby1.86/Ruby/lib/lbc/Path.rb:4:in `foreach'
from D:/Program Files/Ruby1.86/Ruby/lib/lbc/Path.rb:4:in `trave_path'
from D:/Program Files/Ruby1.86/Ruby/lib/lbc/Path.rb:4:in `trave_path'
from D:/Program Files/Ruby1.86/Ruby/lib/lbc/Path.rb:4:in `foreach'
from D:/Program Files/Ruby1.86/Ruby/lib/lbc/Path.rb:4:in `trave_path'
from get_zfbp.rb:1
注意:如果“6124000”本身就是文件,程序是可以运行的。
难道不能在嵌套程序中调用block呢,还是我的用法不对。请大家指教。2009年1月02日 12:22
3个答案 按时间排序 按投票排序
-
采纳的答案
哦另外,这个方法不是太安全。如果第一次调用传入的参数是一个不存在的路径,那么会进入else分支,而这并不意味着它是一个文件。不知道这个行为是否符合你原本的预期。我觉得还是用elsif File.file?来检查一下比较好
2009年1月02日 13:29
-
在给关联block名字之后,既可以照旧使用yield来调用关联block,也可以使用block的变量来调用。前面我是用了b[path, *args],这个是b.call(path, *args)的简写。
用回yield的话就是:def trave_path(path, *args, &action) if File.directory? path Dir.foreach(path) { |p| trave_path path + "/" + p, *args, &action unless p =~ /^\./ } elsif File.file? yield path, *args end end trave_path('61240000') do |pa| p pa end
2009年1月02日 14:21
-
不是说“不能在嵌套程序中调用block”,而是你的写法使得递归调用中block没有被关联到方法上。就是说,这个调用:
trave_path path + "/" + p, *args
没有任何信息说明有block跟它关联着。Block与方法的关联关系在递归调用中是不继承的。
所以显式的指定这个关联关系就行:def trave_path(path, *args, &b) if File.directory? path Dir.foreach(path) { |p| trave_path path + "/" + p, *args, &b unless p =~ /^\./ } else b[path, *args] end end # trave_path('61240000') do |pa| p pa end
2009年1月02日 13:20
相关推荐
// 调用Block并传递值 transferBlock(@42); ``` 在Swift中,类似地,我们可以创建一个接收并打印传递值的闭包: ```swift // 定义闭包类型 typealias ValueTransferClosure = (value: NSNumber) -> Void // 实例...
Block允许我们在代码中定义小型的、可嵌套的函数式片段,可以作为参数传递,也可以在其他函数中返回。 首先,我们来看Block的基本结构。在Objective-C中,Block的定义类似于以下形式: ```objc ^(参数类型列表)...
尽管它只支持整数类型,但是其程序结构非常完整,支持嵌套的分程序(block)结构,即在一个分程序内部可以定义常量、变量以及无参数的过程。此外,PL/0还支持以下几种语句类型: - **赋值语句** (`ident := Exp`) - *...
- 关键字是C语言预定义的保留词,如`int`, `if`, `else`等,不能用作标识符。 - **C 语言数据类型** - 基本数据类型包括整型(`int`)、浮点型(`float`、`double`)、字符型(`char`)等。 - 复合数据类型如数...
在微信小程序中,实现类似抖音翻页切换视频的功能,我们可以借助`swiper`组件。`swiper`组件主要用于创建轮播图,它可以实现上下或左右滑动的效果,非常适合用来模仿抖音视频的翻页切换。本实例将详细讲解如何使用`...
在尝试了Perl 5和Python之后,他意识到这两种语言并不能满足他对面向对象编程的需求。因此,他决定自己创造一种新的语言,这种语言既能拥有Perl的强大功能,又能实现Python的面向对象特性。 **1.2 Ruby名字的由来**...
以单列布局为例,我们来看看如何在顶层模板`1column.phtml`中嵌套多个块。 - **HTML结构**:此文件定义了页面的基本HTML结构,包括头部、主体和尾部。 - **块嵌套**:通过`getChildHtml`方法在各个位置嵌套不同的块...
- 多行批注以`/*`开始,`*/`结束,但不能嵌套使用。 - 注释在代码中用于解释和提高代码的可读性,对于维护和理解代码非常重要。 7. **输入输出处理**: - `java.util.Scanner`类:从J2SE 5.0开始引入,用于读取...
为了动态更改这个值,我们不能简单地重新生成整个`users`数组,因为这会影响性能。正确的做法是只修改需要变动的部分,如: ```javascript clickFunc: function(event) { var that = this; var dataJson = {}; ...
`final` 关键字用于定义最终类或方法,这些类或方法不能被继承或重写。 ### 更多高级主题 #### lazy修饰符和lazy方法 `lazy` 是一种属性修饰符,用于延迟属性的初始化直到第一次使用。这对于提高程序启动速度非常...
从实用角度来看,它可以被视为一个庞大的几何造型库,主要用于三维模型的构建与处理。 - **应用环境**: ACIS 的运行环境主要基于两种编程语言——**Scheme** 和 **C++**。这两种语言的选择使得 ACIS 在保持高性能的...
在Ruby中,Block是一段可以嵌套在方法调用中的代码,它可以有参数,并且可以返回值。如果一个方法包含`yield`关键字,那么在调用该方法时,Block中的代码将被执行。例如: ```ruby def two_times yield yield end...
9.5 能搜能试不急问 396 第10章买鱼,居然买出方法论 398 10.1 小余买鱼系列故事 398 10.1.1 诊断与改进 398 10.1.2 需求与设计 401 10.1.3 资源的利用 403 10.1.4 真正的需求 404 10.2 买鱼买出了方法论 405 10.2.1...
- 程序按搜索顺序执行所有嵌套程度大于当前CATCH模块的FINALLY模块; - 执行当前CATCH模块中的异常处理函数; - 异常处理函数结束后,终止异常,并从异常被处理处继续执行,即继续执行当前CATCH模块后的FINALLY模块...
这些工具提供了丰富的API和组件,能更便捷地处理DOM操作和事件绑定,例如使用jQuery的`slideToggle`方法实现动画效果,或在Vue.js中利用`v-if`和`v-for`指令动态渲染树结构。 综上所述,无限级可刷新Js树型菜单涉及...
首先,我们来看一下数据定义和宏定义的部分: 1.1 数据结构是操作系统的基础,它们定义了操作系统如何存储和管理信息。在REX中: - TCB(Task Control Block)任务控制块是每个运行任务的核心数据结构,包含了任务...
同时,利用CSS的`display`属性,可以设置列表项为块级元素(如`display: block`)或者 Flexbox 或 Grid 布局,以实现多列布局或者层次感。 在CSS方面,我们需要注意响应式设计,确保列表在不同屏幕尺寸下都能良好...
在jQuery中,我们可以通过递归调用来处理多级菜单的展开和收缩。递归函数可以接受当前菜单项的层级作为参数,并根据需要遍历和操作其子菜单。 此外,为了提升用户体验,我们还可以添加过渡效果,如淡入淡出或滑动...
- **Async/Await**:进一步简化了异步代码的编写,使异步代码看起来更像同步代码。 ### 事件冒泡与捕获 **事件冒泡**:事件首先触发最内层的元素,然后向外传递直到到达顶层元素。 **事件捕获**:与事件冒泡相反,...
首先,让我们来看看Python中的基本数据类型: 1. **数**:Python支持四种类型的数:整数、长整数、浮点数和复数。整数如2,长整数表示较大的整数值,如1000000000000。浮点数如3.23和52.3E-4,其中E表示科学记数法...