有人想解释这种语法在Ruby中的含义吗?
class Animal
def name_category
@animals ||={}
end
end
另外,有没有办法在不使用attr_accessor,attr_reader,attr_writer或def initialize的情况下设置对象变量?
答案 0 :(得分:6)
||=
是Ruby的条件赋值运算符。 <{1}}通常可以作为
a ||= b
也就是说,如果a || (a = b)
为a
或b
,则a
被分配nil
(即false
以{的虚假为条件{1}})。
运算符利用a = b
计算方式的属性。也就是说,a
的右手操作数未被评估,除非左手操作数是真实的(即,不是||
或||
)。这称为short-circuiting。
在您的情况下,除非false
已经拥有非虚假值,否则它将被绑定到空哈希nil
。
值得注意的是,尽管@animals
与{}
和||=
等运营商存在肤浅的相似性,但+=
并不等同于-=
。
对于反例,请a ||= b
。然后:
a = a || b
与
比较a = Hash.new(true)
但是,严格来说a[:key] ||= :value
#=> true
a
#=> {}
也不等同于a[:key] = a[:key] || :value
#=> true
a
#=> {:key=>true}
。如果未定义a ||= b
,则
a || a = b
但
a
和
>> a || a = false
#=> NameError: undefined local variable or method `a' for main:Object
要记住一些事情。
因此,如果>> a ||= false
#=> false
等同于
>> a = a || false
#=> false
这是一篇关于Ruby Inside的好文章,详细阐述了这一点。
答案 1 :(得分:0)
它相当于(真正长手不合适的形式):
if @animal == nil # (falsey really, but nil is what we're looking for here)
@animal = {}
end
return @animal
基本上:返回@animal,除非它没有初始化,在这种情况下,在返回之前将其初始化为{}。
你也可以把它写成:
@animal = {} unless @animal
return @animal
或
@animal ||= {}
return @animal
但是@animal || = {}无论如何都会评估为@animal,你可以跳过返回