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

        刚开始接触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入门的好教材。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值