带有哈希的Ruby条件赋值

时间:2014-03-21 21:55:13

标签: ruby

有人想解释这种语法在Ruby中的含义吗?

class Animal
  def name_category
    @animals ||={}
  end
end

另外,有没有办法在不使用attr_accessor,attr_reader,attr_writer或def initialize的情况下设置对象变量?

2 个答案:

答案 0 :(得分:6)

||=是Ruby的条件赋值运算符。 <{1}}通常可以作为

的简称
a ||= b

也就是说,如果a || (a = b) ab,则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,你可以跳过返回