• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Ruby中的Proc类及Proc的类方法Proc.new的使用解析

    Proc是对块及其context(局部变量的作用域以及栈框架)进行对象化处理之后得到的过程对象。您可以像使用无名函数那样来使用Proc,但它不会导入局部变量的作用域(可以把动态局部变量用作Proc局部变量)。

    在下例中,正因为Proc一直保持着局部变量的作用域,所以才能调用var变量。

    var = 1
    $foo = Proc.new { var }
    var = 2
    
    def foo
     $foo.call
    end
    
    p foo    # => 2
    
    

    从生成Proc的方法中返回以后,若Proc中出现return或retry的话,会引发LocalJumpError异常。

    def foo
     proc { return }
    end
    
    foo.call
    # => in `call': return from proc-closure (LocalJumpError)
    
    def foo
     proc { retry }
    end
    
    foo.call
    # => in `call': retry from proc-closure (LocalJumpError)
    
    

    若在Proc前面加上""并将其传给一个带块的方法时,其运作情形类似于调用块。但从严格意义上讲,其间还存在以下不同。

    # 没问题
    (1..5).each { break }
    
    # 在ruby 1.6.7, 1.8中没问题。在1.6.8中则发生异常
    proc = Proc.new { break }
    (1..5).each(proc)
    
    # 在ruby 1.6 中是 LocalJumpError
    # 在ruby 1.8 中,再次运行each
    proc = Proc.new { retry }
    (1..5).each(proc)
    #=> retry from proc-closure (LocalJumpError)
    
    

    这正是Proc对象用作调用块时的限制。

    Proc.new
    Proc.new { ... }
    

    对块及其context进行对象化处理之后返回结果。

    若没有给出块的话,就会把调用该方法的方法所带的块转换为Proc对象并将其返回。

    def foo
      pr = Proc.new
      pr.call(1,2,3)
    end
    foo {|args| p args }
    # => [1, 2, 3]
    
    

    Proc.new方法深入
    Proc.new对块及其context进行对象化处理之后返回结果。

    若没有给出块的话,就会把调用该方法的方法所带的块转换为Proc对象并将其返回。

    def foo
      pr = Proc.new
      pr.call(1,2,3)
    end
    foo {|args| p args }
    # => [1, 2, 3]
    这与下例相同
    def foo
     yield(1,2,3)
    end
    foo {|args| p args }
    # => [1, 2, 3]
    

    若主调方法并没有带块时,则引发ArgumentError异常。

    def foo
     Proc.new
    end
    foo
    # => -:2:in `new': tried to create Proc object without a block (ArgumentError)
         from -:2:in `foo'
         from -:4
    

    在使用Proc.new时,若定义了Proc#initialize方法的话,就在对象初始化时调用该方法。除此以外,它和proc是相同的。

    利用 Proc.new 方法,或者对 proc 方法指定块,都可以创建代表块的 Proc 对象。

    通过调用 Proc#call 方法执行块。调用 Proc#call 方法时的参数会作为块变量,块中最后一个表达式的值则为 Proc#call 的返回值。Proc#call 还有一个名称叫 Proc#[]。

    # 判断西历的年是否为闰年的处理
    leap = Proc.new do |year|
     year % 4 == 0  year % 100 != 0 || year % 400 ==0
    end
     
    p leap.call(2000)  #=> true
    p leap[2013]     #=> false
    p leap[2016]     #=> true
    

    将块变量设置为 |* 数组 | 的形式后,就可以像方法参数一样,以数组的形式接收可变数量的参数。

    double = Proc.new do |*args|
     args.map{|i| i * 2 }  # 所有元素乘两倍
    end
     
    p double.call(1, 2, 3)  #=> [2, 3, 4]
    p double[2, 3, 4]     #=> [4, 6, 8]
    

    除此以外,定义普通方法时可使用的参数形式,如默认参数、关键字参数等,几乎都可以被用于块变量的定义,并被指定给 Proc#call 方法。

    您可能感兴趣的文章:
    • 详解Ruby中的单件方法和单件类
    • Ruby面向对象编程中类与方法的基础学习
    • Ruby类实例变量、类实例方法和类变量、类方法的区别
    • Ruby面向对象编程中类的方法与类的扩展
    上一篇:详解Ruby中的代码块对象Proc
    下一篇:Ruby中的block代码块学习教程
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Ruby中的Proc类及Proc的类方法Proc.new的使用解析 Ruby,中的,Proc,类及,的,类,