带有哈希的Ruby条件赋值

Chr*_*kai 0 ruby

有人想解释这个语法在Ruby中意味着什么吗?

class Animal
  def name_category
    @animals ||={}
  end
end
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*mer 6

||=是Ruby的条件赋值运算符.a ||= b通常可以作为简称

a || (a = b)
Run Code Online (Sandbox Code Playgroud)

也就是说,如果是或者(即,以虚假的条件为条件)a被分配.banilfalsea = ba

操作员利用||评估方式的属性.即,||除非左手操作数是真实的(即,不是falsenil),否则不评估右手操作数.这被称为短路.

在您的情况下,除非@animals已经拥有非虚假值,否则它将被绑定到空哈希{}.

需要注意的是尽管表面上的相似是很重要的||=像运营商+=-=,a ||= b不等同于a = a || b.

对于一个反例,请采取a = Hash.new(true).然后:

a[:key] ||= :value
#=> true
a
#=> {}
Run Code Online (Sandbox Code Playgroud)

与之比较

a[:key] = a[:key] || :value
#=> true

a
#=> {:key=>true}
Run Code Online (Sandbox Code Playgroud)

但是,严格来说a ||= b也不等同于a || a = b.如果a未定义,那么

>> a || a = false
#=> NameError: undefined local variable or method `a' for main:Object
Run Code Online (Sandbox Code Playgroud)

>> a ||= false
#=> false
Run Code Online (Sandbox Code Playgroud)

>> a = a || false
#=> false 
Run Code Online (Sandbox Code Playgroud)

要记住的事情.

所以它更准确,如果说语法更优雅,那就a ||= b相当于

(defined?(a) && a) ? a : a = b
Run Code Online (Sandbox Code Playgroud)

这是关于Ruby Inside的一篇好文章,详细阐述了这一点.