`
calmness
  • 浏览: 354806 次
  • 性别: 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第二章之后你就不会自己写循环去做数组过滤。

相关推荐

    避开10大常见坑:DeepSeekAPI集成中的错误处理与调试指南.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    前端分析-2023071100789

    前端分析-2023071100789

    基于kinect的3D人体建模C++完整代码.cpp

    基于kinect的3D人体建模C++完整代码.cpp

    搞机工具箱10.1.0.7z

    搞机工具箱10.1.0.7z

    GRU+informer时间序列预测(Python完整源码和数据)

    GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。

    性价比革命:DeepSeekAPI成本仅为GPT-4的3%的技术揭秘.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水

    基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟

    auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

    auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

    复件 复件 建设工程可行性研究合同[示范文本].doc

    复件 复件 建设工程可行性研究合同[示范文本].doc

    13考试真题最近的t64.txt

    13考试真题最近的t64.txt

    Microsoft Visual C++ 2005 SP1 Redistributable PackageX86

    好用我已经解决报错问题

    嵌入式开发入门:用C语言点亮LED灯的全栈开发指南.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    auto_gptq-0.4.2-cp38-cp38-win_amd64.whl

    auto_gptq-0.4.2-cp38-cp38-win_amd64.whl

    自动立体库设计方案.pptx

    自动立体库设计方案.pptx

    手把手教你用C语言实现贪吃蛇游戏:从算法设计到图形渲染.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    性能对决:DeepSeek-V3与ChatGPTAPI在数学推理场景的基准测试.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    从零到一:手把手教你用Python调用DeepSeekAPI的完整指南.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    为什么你的switch总出bug?90%新手不知道的break语句隐藏规则.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    用deepseek变现实操流程

    用deepseek变现实操流程,小白必看。

    10个必知的DeepSeekAPI调用技巧:从鉴权到限流全解析.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

Global site tag (gtag.js) - Google Analytics