美文网首页
ruby中的block

ruby中的block

作者: kamionayuki | 来源:发表于2015-05-27 09:13 被阅读57次

首先,我们先为Array新增一个迭代方法iterate!,如下:

class Array
    def iterate!
        self.each_with_index do |m,i|
            self[i] = yield(m)*10
        end
    end   
end
array = [1,2,3,4]

那么我们看看应该怎么调用?

array.iterate! do |m|   
    m **=2
end
p array  #=> [10,40,90,160]

与属性不同,在方法中不需要指定block的名字,而是使用yield来调用。yield会执行block中的代码。同时,注意我们是怎么把n(each_with_index当前处理的数字)传给yield的。传给yield的参数即对应了block中的参数(||中的部分)。现在m就能被block调用并在yield调用中返回m**2
整个调用如下:

  • 一个整数组成的数组调用iterate!
  • 当yield被调用时,把m(第一次为1,第二次为2,…)传给block
  • block对m进行m**2。因为是最后一行,自动作为结果返回。
  • yield得到block的结果,并把值*10后重写到array里。
  • 数据中每个对象执行相同操作。

那么这样写的输出是什么呢?

array.iterate! do |m|   
    m **=2
    m+2
end
p array  #=> [30,60,110,180]

即把block中的m+2的值传给了yield,此时的m已经做过平方的计算了。然后再*10后重写到array里。
那么这样写的输入又如何呢?

array.iterate! do |m|   
    m **=2
    m+2
    n = 100000
end
p array  #=> [1000000,1000000,1000000,1000000]

即把block中的n的值传给了yield。
继续往下尝试

k = 0
array.iterate! do |m|   
    m **=2
    m+2
    n = 100000
    k
end
p array  #=> [0,0,0,0]

即把block中的k的值传给了yield。

由此可知,ruby会把block中最后一个表达式的值传给迭代方法中的yield,然后再进行计算。
甚至可以这样:

class Array
    def iterate!
        self.each_with_index do |m,i|
            $a ||= []
            $a << yield(m)*10
        end
    end   
end

$a
array = [1,2,3,4]
k = 0.9
array.iterate! do |m|
    m **=2
end

p $a  #=> [10, 40, 90, 160]

相关文章

  • ruby中的block

    首先,我们先为Array新增一个迭代方法iterate!,如下: 那么我们看看应该怎么调用? 与属性不同,在方法中...

  • Ruby的block

    初识block 带block方法的定义 假设我们自己要定义一个可以接受block的方法,我们应该怎样来定义,又怎样...

  • yield和block总结

    在ruby中以do...end包括的内容为block(代码块),如果只有一行可以用{...}.block无法单独存...

  • Ruby代码块

    Ruby最强大的语言就是他的代码块 [root@master1 ruby]# cat test_block.rb

  • Ruby: Code Block

    代码块是什么? 代码块是由 {...} 或 do..end 包围起来的一块代码。代码块通常用于实现自定义的运算,有...

  • Ruby的Block浅析

    最近在看Ruby Under a Microscope分析Ruby内部的运行机制,准备写一些总结首先从Ruby的B...

  • [转]浅谈Ruby中的block, proc, lambda,

    本文主要介绍了ruby开发中的比较容易混淆的几个概念,并以简单示例的形式展现他们之间的区别,明白了这些区别之后,在...

  • 安装GitLab出现ruby_block[supervise_r

    安装GitLab出现ruby_block[supervise_redis_sleep] action run 在卸...

  • Day3 读书笔记&心得体会

    一、读书笔记2.6 Block和迭代器 本节简单描述Ruby的一个独特特性,Block,一种可以和方法调用相关联的...

  • ruby proc/lambda/method/block

    一:proc / lambda 1.让我们分别以proc和lambda两种方式来定义代码块 2.proc和lamb...

网友评论

      本文标题:ruby中的block

      本文链接:https://www.haomeiwen.com/subject/ujurqttx.html