`
calmness
  • 浏览: 354014 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

迭代器+代码块,让代码更简短

    博客分类:
  • Ruby
阅读更多

        刚开始接触ruby,作为一个以JAVA开发为主的程序员,ruby的代码风格多少让我有点不太适应,也许习惯了复杂的风格,再简单起来就比较困难了吧, 看来没有其他语言牵绊的话,学起ruby应该更快。

        今天看了下ruby中的迭代器和代码块,这两个概念在其他语言当中也有,但是ruby中的迭代器和代码块却给我焕然一新的感觉,也让我更加了解到ruby代码简短的一个原因,正所谓实践出真知,就让我举个简单的例子吧:

        一个包含一个存储字符串的数组的类,写一个[]方法,方法传递一个key参数,如果参数为整数则直接用索引返回字符串,如果不是整数则判断数组中是否存在该值,存在则返回该字符串,否则返回nil。以下只写[]方法的实现

        按照一般的写法

         def [](key)
           if key.kind_of?(Integer)
             return @arr[key]
           else
            for i in 0...@arr.length
               return @arr[i] if key == @arr[i]
            end
          end
          return nil
         end

       这种写法我想大多数刚刚接触ruby的朋友都应该很熟悉,在其他语言中一般也是类似的写法,现在我们使用代码块+迭代器对这段代码改写一下

         def [](key)
           if key.kind_of?(Integer)
             result = @arr[key]
           else            
               result = @arr.find{|str| key == str}            
          end
          return result
         end

        是不是简短了很多呢?主要就是@arr.find{|str| key == str} 这一句代码,find方法是Array的一个迭代器,而后面大括号中的内容就是一段代码块,这样就实现了和最上面那段代码一样的功能,且代码也简短了不少,让我们一起来看看find方法的大概实现吧

        def find  
            for i in 0...size  
                value = self[i]  
                return value if yield(value)  #此处调用代码块中的代码
            end  
            return nil  
        end  

        value if yield(value)  这一句的yield就是调用代码块中的代码,后面括号的内容就是代码块的参数, 看到这里,相信不少刚刚接触的ruby的朋友都可能会觉得满意了,不,其实这段代码还能更简单,请看

        def [](key)  
           return @arr[key] if key.kind_of?(Integer)      
           return @arr.find { |str| str == key }
        end

        哇,是不是又让人吃了一惊呢?居然仅仅两行代码就OK了,是否很惊奇呢?我也一样很惊奇,在没接触ruby之前,就到处听人说ruby的神奇之处,写ruby代码是一种享受,开始却是很怀疑,等到自己真正接触之后,才发现写ruby程序真的是一种享受,也许一开始无法一下能把代码写到最简单,而且也很难习惯ruby的风格,不过没有关系,只要有心,就一定能写得好,习惯是慢慢养成的。本文参考了Programming Ruby中的例子,有条件的朋友可以去买本来看看,这本书却是是ruby入门的好教材。

分享到:
评论
7 楼 calmness 2007-02-19  
关于实际JAVA开发中我会如何做在此不多做讨论,而我所说的:“在实际编写过程中当然不会一遍又一遍的写循环代码”是指ruby而言,请gigix不要误会,呵呵
6 楼 gigix 2007-02-19  
calmness 写道
   明白,在实际编写过程中当然不会一遍又一遍的写循环代码,我之所以写这篇文章只是想展示一下ruby的简单性和直观性,不可否认,很多初初接触ruby的朋友,不可能一开始就能将这段代码写得如此简单。
    对SICP下了订单,听说这本书有点难度,以后有不明白的地方请gigix多多指点。

实际上用Java编程你就会这样做。关键在于用Java的时候即便你想采用函数式的列表操作,动用匿名函数写出来的代码量一点都不比直接写循环来得少,可读性反而更低(ajoo以前有个帖子讲这事),其结果是习惯了Java的程序员可能压根就不想用列表操作。
5 楼 ozzzzzz 2007-02-19  
gigix继续看,特别是第四章,你会发现列表还是有不同于数组的地方的。
4 楼 calmness 2007-02-19  
   明白,在实际编写过程中当然不会一遍又一遍的写循环代码,我之所以写这篇文章只是想展示一下ruby的简单性和直观性,不可否认,很多初初接触ruby的朋友,不可能一开始就能将这段代码写得如此简单。
    对SICP下了订单,听说这本书有点难度,以后有不明白的地方请gigix多多指点。
3 楼 gigix 2007-02-18  
简单地说,列表(LISP黑话,也就是数组)有几个基本操作,用Ruby的黑话来说就是map, inject和find(以及衍生出来的reject)。一般而言几乎所有的循环遍历数组操作都可以归约为基本操作或者基本操作的组合。这样做的好处之一是你不必一遍又一遍地写循环代码,更重要的好处是清晰地描述你做遍历操作的目的
2 楼 calmness 2007-02-18  
呵呵,我水平有限,SICP也没看过,多谢gigix的建议,我一定会找本来看看
1 楼 gigix 2007-02-18  
对于你的这一个特定问题,看过SICP第二章之后你就不会自己写循环去做数组过滤。

相关推荐

    C++全方位学习-一个最简短的C++程序讲起

    此外,标准库(如STL,Standard Template Library)提供了丰富的容器、迭代器和算法,极大地提高了开发效率。 总之,从一个最简短的C++程序开始,逐步深入到更复杂的概念和技术,是学习C++的常见路径。这个压缩包很...

    MySQL++使用手册

    - **操作**:可以通过迭代器遍历数据行,获取字段值。 **2.4 异常处理** - **功能**:MySQL++ 支持异常处理机制,用于捕获执行过程中出现的错误。 - **示例**:通过抛出异常来处理连接失败、查询错误等问题。 ####...

    阿里代码规范练习题目及答案.docx

    - 在同步处理时,尽可能减少锁的范围,只锁定必要的代码块,同时要考虑高并发时的性能影响。 - 创建线程或线程池时,建议赋予线程有意义的名称,方便出现问题时追踪。 - 使用`ThreadPoolExecutor`而不是`...

    Python基本语法.docx

    Python利用缩进来划分代码块,而不是像C或Java那样使用花括号。例如,if语句的结构如下: ```python if condition: # 当条件为真时执行的代码 else: # 当条件为假时执行的代码 ``` if语句可以与elif一起使用,...

    Google Python代码规范

    - **默认迭代器与运算符**:使用默认迭代器和运算符来简化循环和条件语句。 - **生成器**:轻量级的函数,可以暂停执行并在后续调用时继续执行。 - **lambda函数**:简短的匿名函数,适用于简单的操作。 - **默认...

    python试题python面试题目

    Python的语法特征之一就是强制使用缩进来组织代码逻辑,缩进用于定义代码块,比如if语句、for循环、函数和类的定义等。通常,Python使用四个空格作为标准缩进,避免使用制表符,以保持代码的一致性。如果缺少缩进或...

    C++编程规范

    - 在代码块开始处添加简短的单行注释,描述该段代码的功能。 3. **代码格式化**: - 使用4个空格缩进,避免使用制表符。 - 每行不超过80字符,过长的语句应分行书写。 - 函数定义和声明之间空一行,同一级别...

    cpp代码-测试文件1

    10. **STL(Standard Template Library)**:C++标准模板库,包括容器(如vector、list、set)、迭代器、算法和函数对象等,极大地提高了代码效率和可读性。 综上所述,这个"cpp代码-测试文件1"项目涉及到的C++编程...

    深入理解C#2.0版

    匿名方法是在C# 2.0中新增的一种功能,它允许在不定义显式方法的情况下传递代码块。这种特性对于事件处理非常有用,可以将简短的代码片段作为参数传递给方法。例如,可以将匿名方法用于事件处理程序或委托的构造函数...

    Python之匿名函数共2页.pdf.zip

    Python之匿名函数是编程语言Python中的一个重要特性,它允许我们在不需要定义一个完整函数的情况下,使用一次性、简洁的代码块来执行特定任务。这种函数在Python中被称为lambda函数,源自Lambda演算,它体现了函数式...

    FullSpeed-Python-英文版.pdf

    4. **模块和函数(Modules and functions)**: 模块是Python代码的组织单元,函数则是可重用的代码块。这部分将讲述如何导入和使用模块,定义和调用函数,以及函数参数和返回值的概念。 5. **迭代和循环(Iteration ...

    高质量C++编程指南,提高C++编程质量

    2. **STL(Standard Template Library)**:包括容器(如vector、list)、迭代器、算法和函数对象,是C++的重要组成部分。 3. **异常处理**:通过try-catch块处理运行时错误。 4. **命名空间**:避免名字冲突,提高...

    c代码-5-2例while1+2+3+…+10

    1. `while`循环的使用:如何根据条件重复执行代码块。 2. 变量的声明与初始化:如何创建并设置变量的初始值。 3. 条件判断:如何使用比较运算符检查条件。 4. 算术运算:在这个例子中是加法(`+`)。 5. 控制流:...

    C语言的常用术语.pdf

    61. 迭代控制流(Iterativeflowofcontrol):迭代控制流用于重复执行代码块直到满足特定条件,例如while和for循环。 62. 二元运算符(Binary)和一元运算符(Unary):二元运算符需要两个操作数,如加法运算符(+)...

    Python命名规范1.pdf

    在Python中,代码块是通过缩进来表示的,同一级别的代码块具有相同的缩进。合理的缩进是保证代码可读性的关键。 此外,Python代码中还可能涉及函数装饰器、类装饰器、上下文管理器、迭代器、生成器、正则表达式、元...

    关于如何编写更好的python代码的文章集合-python

    遵循PEP 8可以使代码更易于阅读和维护。例如,函数和变量名应使用小写字母和下划线(snake_case),类名使用首字母大写的驼峰式命名(CapWords)。 2. **异常处理**: Python中的错误通过异常来表示,使用try/...

    sun推荐的Java编码规范

    合理使用集合类和迭代器,避免不必要的计算和内存分配。 总的来说,Sun推荐的Java编码规范是Java开发者的指南,它帮助我们编写出易于理解、易于维护的高质量代码,从而提升整个开发团队的效率和项目的成功率。遵循...

    C++ 编程规范

    - 避免对容器的迭代器进行增删元素操作,可能导致迭代器失效。 9. **封装和接口设计** - 类的设计应遵循最小权限原则,尽可能使成员私有,仅通过公有接口访问。 - 使用`const`修饰符来表明函数不会修改对象状态...

    C++ 编程规范101条中文版

    4. **异常安全**:在可能抛出异常的代码块中,确保资源的正确释放。理解并使用异常安全的编程技术,如异常安全函数和异常不变量。 5. **类型安全**:尽量使用强类型,避免隐式类型转换可能导致的问题。利用`static_...

    cpp代码-project001

    - **标准库**:如STL(Standard Template Library),可能使用了容器(如vector、list)、算法或迭代器。 总之,`cpp代码-project001`是一个学习和实践C++编程的实例,通过分析和理解其中的代码,不仅可以巩固C++...

Global site tag (gtag.js) - Google Analytics