http://www.letrails.cn/archives/difference-between-for-loop-and-each/
上看到
for和each的区别主要在于:
for是通过调用each实现,因此for更慢一些
for会在each的scope之外创建一个局部变量,这在某些情况下会引发问题
关于第二点,下面的代码可以很好的说明这个问题:
irb> [1, 2, 3].each do |m| puts m end
irb> puts m
NameError: undefined local variable or method `m' for main:Object
irb> for n in [1, 2, 3] do puts n; end
irb> puts n
=> 3
如果你不了解这一点,那么在某些特殊的情况下,你可能会遇到麻烦,Ruby Forum的某个用户提交的一段代码很好的说明了for可能引发的问题:
a = []
for n in [1, 2, 3] do
a << Proc.new {puts "#{n}"}
end
[1,2,3].each do |m|
a << Proc.new {puts "#{m}"}
end
a.each { |p| p.call }
运行结果:
3
3
3
1
2
3
很显然,for循环的结果不是我们所期待的,因此,结论就是:应该尽可能的使用each替代for循环。
更新:应该使用each代替for的真正原因是,for实际上是通过each实现的,但它在each的scope外面定义了一个同名变量,下面的代码可以说明问题:
>> a = “1\n2\n”
>> def a.each
>> yield(1)
>> end
>> for i in a
>> puts i
>> end
1
=> nil
也就是说“for i in [1, 2]”就相当于“i = nil;[1,2].each do |i|”,因此前面的结论是不正确的,for应该比each慢(没有进行过测试),这才是for真正的问题所在。
分享到:
相关推荐
在这篇文章中,作者通过实际的代码示例对JQuery的for循环与.each()方法在性能方面进行了比较分析。 首先,我们必须了解for循环和.each()方法在使用场景上的差异。for循环是一种传统的JavaScript循环结构,它依赖于...
FOR EACH STATEMENT BEGIN INSERT INTO audit_ddl_log (event_time, user_name, ddl_statement) VALUES (SYSDATE, USER, :SQLCOMMAND); END; / ``` 这个触发器会在每次执行DDL语句后记录操作的时间、执行用户和...
以上代码通过`For Each`循环遍历`Dictionary`中的每一个键值对。对于每一个键值对,它会获取对应的`OrderProduct`实例,并通过`Response.Write`函数将产品名称和产品数量等信息输出到页面上。这种显示方式简洁明了,...
对于For Each Loop,我们需要配置一个枚举器,它可以是文件枚举器来遍历文件,或者是ADO.NET枚举器来遍历数据库记录。 在实际开发案例中,参数和循环经常结合使用。例如,我们可以创建一个For Each Loop,遍历一个...
例如,要显示`TABLE_NAME`表的所有记录和字段,可以使用`for each`循环: ```progress for each TABLE_NAME: display TABLE_NAME. end. ``` 若只想显示第一条记录,可以添加`find first`: ```progress find ...
在这个例子中,`t_name`是触发器的名称,`before update on ts`表示在更新`ts`表时触发,`for each row`表示对每一行进行操作,最后的`execute procedure upd_timestamp();`指定了执行的函数。 为了测试这个设置,...
Wend或For Each... Next循环,修改记录则使用rs("FieldName") = newValue的方式。 VB也支持事务处理,这对于确保数据库操作的原子性和一致性至关重要。在开始一系列可能需要回滚的操作之前,可以调用Connection...
For Each ni As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces() If ni.OperationalStatus = OperationalStatus.Up AndAlso ni.NetworkInterfaceType <> NetworkInterfaceType.Loopback Then mac...
接下来,定义数据库连接对象和记录集对象。在VB6.0中,我们可以使用`Dim`关键字来声明这些对象: ```vb Dim db As DAO.Database Dim rs As DAO.Recordset ``` 然后,我们需要打开数据库。假设Access数据库文件名为...
如果要读取整个表格数据,可以使用For Each循环遍历单元格: ```vb Dim rngData As Range Set rngData = xlWorksheet.Range("A1", xlWorksheet.Cells(xlWorksheet.Rows.Count, "A").End(xl.xlUp)) For Each cell ...
- **FOR EACH ROW**:表示对于表中的每一行数据都单独触发一次触发器。如果不使用这个选项,则触发器仅针对整个表的操作被触发一次。 #### 三、触发器的功能与应用 触发器可以实现以下功能: 1. **允许/限制对表的...
For Each rs In db.Recordsets ' 关闭记录集 rs.Close ' 设置为Nothing释放对象 Set rs = Nothing Next ' 关闭数据库 db.Close ' 设置为Nothing释放对象 Set db = Nothing Next ' 关闭Workspace ws....
TexNotes Pro是一款极其优秀的笔记软件,在同类软件中算是佼佼者,与GemX Harmony PIM(do-Organizer)一起使用,能将个人需要一切信息记录下来,比如:个人通讯录、个人日志、个人财务、个人密码管理、个人电子邮件、...
For Each ni As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces() If ni.OperationalStatus = OperationalStatus.Up Then For Each unicastAddress In ni.GetIPProperties().UnicastAddresses ...
1. **记录选中的项**:当用户选中某一行时,需要将其ID或其他唯一标识符记录下来。 2. **取消监听**:为了避免在加载新数据时自动取消之前的选择,需要在加载新数据前移除相关的事件监听器。 3. **重新选择**:加载...
for each character in line: // 进一步处理字符 ``` ##### 2. 字频统计 - **实现方法**:使用数组或哈希表来记录每个字符的出现次数。 - **关键点**:确保正确统计大小写字母等不同字符类型的频率。 - **示例...
在VBA中,我们可以使用For Each循环遍历数组或集合,配合If条件语句进行数据筛选,例如,找出采购金额超过10000的部门: ```vba For Each cell In dataRange.Columns(2) If cell.Value > 10000 Then Debug.Print ...
- **For Each Row/Statement**:表示触发器是为每一行数据还是整个语句而触发。 - **Instead Of**:这种类型的触发器在视图中比较常见,用于替代对视图的操作。 #### 三、触发器的创建与管理 根据提供的SQL代码...
For Each group In dataView.Groups Console.WriteLine("Group: " & group.KeyValues(0)) For Each row In group.Rows Console.WriteLine(" Row: " & row("SalesAmount")) Next Next ``` 这将打印出每个产品...