首页 > 代码库 > 关于ruby中的空指针保护(||=)
关于ruby中的空指针保护(||=)
平时我们在写代码,构造嵌套数据或者给某个变量初始化时会用到下面这种形式:
a ||= [] ; a = b || c ; a = a || []
这种形式可以保证,在这些变量要被访问的时候才进行初始化,给我们构造数据带来了极大的灵活性;而这就是ruby中的空指针保护的应用。
要理解空指针保护的工作方式,要从ruby真假值和||操作法两方面着手:
首先,在ruby中除了nil和false被作为false外,其它值就被认为是true
其次,表面上||操作符会在两个表达式中任何一个为true时返回true,两个都为false时,才返回fasle;实际上在ruby中,返回的是表达式的值,如果表达式1的值不是nil或false,那么就返回表达式1的值(被认为是true);若果表达式1的值为nil或false的话,那么||操作符就会判定表达式2的值是否为nil或false,若不为nil或false的话则返回表达式2的值(被认为是true),否则就意味着两个表达式的值都为nil或false,这时就返回nil或false(也就是表达式2的值)。
注意:在上面中返回的都是表达式的值,不是布尔值true或false,而是这些表达式的值被认为是false或true。
例如: if a || b #代码block end
假设 a = "str" b为任意值,a || b 会返回a的值"str",因为a的值不是nil或false而是一个字符串,所以该字符串就被解释器作为true,那么该if条件语句就类似于 if true
假设 a = nil 或false b = 12.5 ,a || b会返回b的值12.5,因为a的值为nil后false,所以就会判定b的值,而b的值为12.5,所以该字符串就被解释器作为true,那么该if条件语句就类似于 if true
假设 a = nil 或false b = nil 或fals ,a || b会返回b的值nil或false,而b的值就被解释器作为false,此时if条件语句就类似于 if false
在看到 a = a || [] 这种写法时也许有人会问:a在这里没有定义啊,会报未定义局部变量或方法的错;其实真相是这样的,ruby中变量的声明和赋值是混在一起的,c = 1 就包含了变量c的声明和变量c的赋值1,也就是说解释器在执行到这行代码时遇到 =号时,那么=左边的变量都进行了声明(也就是声明为变量)而此时没有为变量赋值,所以变量的值为nil,因此会返回[].
例如:
a = 5 if false #变量定义未赋值
a # => nil
关于ruby中的空指针保护(||=)