有人想解释这个语法在Ruby中意味着什么吗?
class Animal
def name_category
@animals ||={}
end
end
Run Code Online (Sandbox Code Playgroud)
另外,有没有办法在不使用attr_accessor,attr_reader,attr_writer或def initialize的情况下设置对象变量?
||=是Ruby的条件赋值运算符.a ||= b通常可以作为简称
a || (a = b)
Run Code Online (Sandbox Code Playgroud)
也就是说,如果是或者(即,以虚假的条件为条件)a被分配.banilfalsea = ba
操作员利用||评估方式的属性.即,||除非左手操作数是真实的(即,不是false或nil),否则不评估右手操作数.这被称为短路.
在您的情况下,除非@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的一篇好文章,详细阐述了这一点.
| 归档时间: |
|
| 查看次数: |
888 次 |
| 最近记录: |