(1)Kennel#block_given?() 用于在方法执行期间判断,是否传入代码块,若是在block_given?()返回false时使用yield关键字,则会获得一个运行时错误ruby
(2)闭包:块只能看见和操做与本身绑定的变量,基于这样的特性,叫闭包闭包
(3)Ruby1.8及之前版本,块中参数变量会覆盖绑定的块绑定的相同变量名变量,Ruby1.9后已不会spa
(4)Kernel#local_variables()方法来跟踪绑定的名字code
(5)在Java和C#中有“内部做用域”的概念,即内部做用域中能够看到“外部做用域”中的变量,但Ruby中做用域是彻底隔离的对象
(6)Ruby中每当打开一个新的做用域时,全部以前做用域的绑定在新做用域中将不可用作用域
(7)程序会在三个地方关闭前一个做用域, 同时打开一个新的做用域:it
类定义,模块 定义, 方法调用class
(8)全局变量$开头变量,能够在任意做用域中访问变量
(9)Ruby的四种种变量区别:module
局部变量:绑定在做用域中,没法跨做用域调用
实例变量:@开头,存在于对象中,在对象中均可以调用
全局变量:$开头,当赋值代码被执行就一直存在,能够在任意做用域调用
类变量 :@@开头, 被子类共用
(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