`
fei1985
  • 浏览: 35532 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

记录下来关于for each区别

阅读更多

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性能比较分析

    在这篇文章中,作者通过实际的代码示例对JQuery的for循环与.each()方法在性能方面进行了比较分析。 首先,我们必须了解for循环和.each()方法在使用场景上的差异。for循环是一种传统的JavaScript循环结构,它依赖于...

    oracle安全审计之登录登出、ddl操作记录触发器

    FOR EACH STATEMENT BEGIN INSERT INTO audit_ddl_log (event_time, user_name, ddl_statement) VALUES (SYSDATE, USER, :SQLCOMMAND); END; / ``` 这个触发器会在每次执行DDL语句后记录操作的时间、执行用户和...

    asp+access 利用类和dictionary实现多行记录的合并显示

    以上代码通过`For Each`循环遍历`Dictionary`中的每一个键值对。对于每一个键值对,它会获取对应的`OrderProduct`实例,并通过`Response.Write`函数将产品名称和产品数量等信息输出到页面上。这种显示方式简洁明了,...

    SQL Server 2008 Integrate Service 基础开发案例系列课程(3)

    对于For Each Loop,我们需要配置一个枚举器,它可以是文件枚举器来遍历文件,或者是ADO.NET枚举器来遍历数据库记录。 在实际开发案例中,参数和循环经常结合使用。例如,我们可以创建一个For Each Loop,遍历一个...

    PROGRESS实很简

    例如,要显示`TABLE_NAME`表的所有记录和字段,可以使用`for each`循环: ```progress for each TABLE_NAME: display TABLE_NAME. end. ``` 若只想显示第一条记录,可以添加`find first`: ```progress find ...

    PostgreSQL更新表时时间戳不会自动更新的解决方法

    在这个例子中,`t_name`是触发器的名称,`before update on ts`表示在更新`ts`表时触发,`for each row`表示对每一行进行操作,最后的`execute procedure upd_timestamp();`指定了执行的函数。 为了测试这个设置,...

    VB数据库及记录集操作工具

    Wend或For Each... Next循环,修改记录则使用rs("FieldName") = newValue的方式。 VB也支持事务处理,这对于确保数据库操作的原子性和一致性至关重要。在开始一系列可能需要回滚的操作之前,可以调用Connection...

    检测计算机名称、IP、MAC、内存大小

    For Each ni As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces() If ni.OperationalStatus = OperationalStatus.Up AndAlso ni.NetworkInterfaceType &lt;&gt; NetworkInterfaceType.Loopback Then mac...

    读取Access数据库结构(VB6.0源代码编写)

    接下来,定义数据库连接对象和记录集对象。在VB6.0中,我们可以使用`Dim`关键字来声明这些对象: ```vb Dim db As DAO.Database Dim rs As DAO.Recordset ``` 然后,我们需要打开数据库。假设Access数据库文件名为...

    vb与EXCEL中的操作

    如果要读取整个表格数据,可以使用For Each循环遍历单元格: ```vb Dim rngData As Range Set rngData = xlWorksheet.Range("A1", xlWorksheet.Cells(xlWorksheet.Rows.Count, "A").End(xl.xlUp)) For Each cell ...

    oracle触发器语法要点

    - **FOR EACH ROW**:表示对于表中的每一行数据都单独触发一次触发器。如果不使用这个选项,则触发器仅针对整个表的操作被触发一次。 #### 三、触发器的功能与应用 触发器可以实现以下功能: 1. **允许/限制对表的...

    精彩编程与编程技巧-用VB实现关闭所有数据库对象...

    For Each rs In db.Recordsets ' 关闭记录集 rs.Close ' 设置为Nothing释放对象 Set rs = Nothing Next ' 关闭数据库 db.Close ' 设置为Nothing释放对象 Set db = Nothing Next ' 关闭Workspace ws....

    TexNotesPro 4.34

    TexNotes Pro是一款极其优秀的笔记软件,在同类软件中算是佼佼者,与GemX Harmony PIM(do-Organizer)一起使用,能将个人需要一切信息记录下来,比如:个人通讯录、个人日志、个人财务、个人密码管理、个人电子邮件、...

    VB.NET 2008 获取本机IP、网卡MAC地址、计算机名

    For Each ni As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces() If ni.OperationalStatus = OperationalStatus.Up Then For Each unicastAddress In ni.GetIPProperties().UnicastAddresses ...

    extjs grid

    1. **记录选中的项**:当用户选中某一行时,需要将其ID或其他唯一标识符记录下来。 2. **取消监听**:为了避免在加载新数据时自动取消之前的选择,需要在加载新数据前移除相关的事件监听器。 3. **重新选择**:加载...

    Huffman编码与文件压缩.

    for each character in line: // 进一步处理字符 ``` ##### 2. 字频统计 - **实现方法**:使用数组或哈希表来记录每个字符的出现次数。 - **关键点**:确保正确统计大小写字母等不同字符类型的频率。 - **示例...

    Excel-VBA宏编程实例源代码-工作簿的操作-各部门采购情况.zip

    在VBA中,我们可以使用For Each循环遍历数组或集合,配合If条件语句进行数据筛选,例如,找出采购金额超过10000的部门: ```vba For Each cell In dataRange.Columns(2) If cell.Value &gt; 10000 Then Debug.Print ...

    oracle触发器

    - **For Each Row/Statement**:表示触发器是为每一行数据还是整个语句而触发。 - **Instead Of**:这种类型的触发器在视图中比较常见,用于替代对视图的操作。 #### 三、触发器的创建与管理 根据提供的SQL代码...

    VB 对查询结果分组

    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 ``` 这将打印出每个产品...

Global site tag (gtag.js) - Google Analytics