• 浅谈ruby中的block及yield


    今天写代码的时候遇到了block_given?,查阅了一下语法书中并没有相关的知识点,于是翻阅微博及结合工作中的实际代码,整理如下:

    一、“块”:

    ruby的块指的是什么?

    是 do~end中间的那部分代码,这就是全部的块。它的形式有两种:

    1、do ~ end中的多行代码(这种在多行代码时可读性更强)

    2、当界面只有一行代码的时候,可以用{ ~}包裹

    块通常不在方法中定义,而是通过作为一个参数传递给块。

    块可以传递给任何方法,前提是方法中有yield关键字块才回被调用并执行,所以yield是定义带块的方法时最重要的关键字,调用方法时通过块传进来的处理会在yield定义的地方被执行。

    先贴一段调用块的代码:、

    def 函数
      p 111
       yield 
      p 222
     end
     
     函数 {p 333}

     输出结果:

    111
    333
    222

     可以看到,yield作为介质,将块传入进了函数方法里,然后继续往下执行 p 222

    二、yield中也可以传递参数

    可见如下代码,yield将参数传递进了块里面,注意参数传入顺序是按照yield写的顺序进行的。

    这样做的一个好处就是写了一个块,但是可以被写在同样方法的不同参数调用,方便快捷。

    1 def method
    2   yield("Joey",12)
    3 end
    4 
    5 method do|name,age| 
    6   p "#{name} is a lovely boy,he is #{age} years old."
    7 end

     输出结果:

    "Joey is a lovely boy,he is 12 years old."

    三、常见的block_given?到底怎么用呢?

    先看这样一段代码,预测一下输出结果是什么样:

    def 函数
      p 111
       yield
      p 222
     end
    函数

    输出结果:

    111

    报错信息: no block given (yield) (LocalJumpError)

    可见,当写了yield,但是并没有块给它调用的时候,程序就会报错。

    block_given?方法就巧妙地根据是否有块,判断是否传递给调用的方法,它是返回一个布尔值。将上面的代码修改一下:

    def 函数
      p 111
      yield if block_given?
      p 55
    end
     
    函数

    输出结果:

    111

    555

    因为没有块,所以不传入块,继续进行下一步的操作 p 55.

  • 相关阅读:
    Trying to get property 'art_id' of non-object
    isset和empty以及is_null区别
    redis异步处理
    redis 基本使用
    nodejs (下)(设置响应参数)
    轮询技术
    mysql优化(下)
    108. Convert Sorted Array to Binary Search Tree
    148. Sort List
    236. Lowest Common Ancestor of a Binary Tree
  • 原文地址:https://www.cnblogs.com/fish-101/p/10476889.html
Copyright © 2020-2023  润新知