ruby元编程——代码块

(1)Kennel#block_given?() 用于在方法执行期间判断,是否传入代码块,如果在block_given?()返回false时使用yield关键字,则会得到一个运行时错误

(2)闭包:块只能看见和操作与自己绑定的变量,基于这样的特性,叫闭包

(3)Ruby1.8及以前版本,块中参数变量会覆盖绑定的块绑定的相同变量名变量,Ruby1.9后已不会

(4)Kernel#local_variables()方法来跟踪绑定的名字

(5)在Java和C#中有“内部作用域”的概念,即内部作用域中可以看到“外部作用域”中的变量,但Ruby中作用域是完全隔离的

(6)Ruby中每当打开一个新的作用域时,所有之前作用域的绑定在新作用域中将不可用

(7)程序会在三个地方关闭前一个作用域, 同时打开一个新的作用域:

         类定义,模块 定义, 方法调用

(8)全局变量$开头变量,可以在任意作用域中访问

(9)Ruby的四种种变量区别:

    局部变量:绑定在作用域中,无法跨作用域调用

    实例变量:@开头,存在于对象中,在对象中都可以调用

    全局变量:$开头,当赋值代码被执行就一直存在,可以在任意作用域调用

    类变量    :@@开头, 被子类共用

(10)block两大作用,跨作用域,代码延迟执行

 (11)打破class作用域门: 使用Class.new + block

my_var = "Success"
MyClass = Class.new do
    p "#{ny_var}"
end

 (12)打破module作用域门: 使用Module.new + block

 (13)打破方法作用域门: define_method + block

 (14)Object#instance_eval()方法,用于将传入的block当做实例方法执行,可以使用instabce_eval + block从对象外改变对象的实例变量,例:

    class MyClass
        def initialize
            @v = 1
        end
    end
    
    obj = MyClass.new
    obj.instance_eval { @v = 2 }     #@v = 2

  (15)block 转换 Proc方式

        (1)Proc.new { |x| x + 1 }

        (2)lambda { |x| x - 1 } (->(x) { x - 1 }  Ruby1.9以后)

        (3)proc { |x| x + 1 }

        (4)&入参

  (16)proc与lambda对比:

        (1)return的退出范围,lambda退出block;proc退出block且退出此block绑定的作用域

        (2)proc对参数个数限制宽松,多了忽略,少了添nil;lambda抛出异常

  (17)Kernel#proc() 方法在Ruby1.8及以前版本是Kernel#lambda()别名,之后是Proc.new() 别名

  (18)object#method(:symbol) 可以获得一个绑定的Method对象 ,Method#call调用,Method#unbind()解绑,返回一个UnboundMethod对象,需要调用bind()绑定一个对象才能调用,Method#to_proc将Method转换成一个proc

转载于:https://my.oschina.net/u/1413049/blog/396834

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值