Ruby ||= Objective-C 中的等效项

2024-04-11

我最近一直在学习 ruby​​,并且基本上喜欢 ||= 功能,因为它会让在 Objective C 中编写惰性 getter 变得更加容易。

目前我编写吸气剂,例如:

- (NSArray *)myArray {
  if (!_myArray) {
    _myArray = [NSArray array];
  }
  return _myArray
}

除非我缺少 ||= 的某些内容,否则我可以使用 Ruby 编写前面的代码:

- (NSArray *)myArray {
  return _myArray ||= [NSArray array];
}

这显然干净得多。 Objective-C 语言/运行时中是否有任何东西可以让您做到这一点?

另外,以下是吸气剂的单行三元,我不确定它是否与上面发布的经过尝试的真实方法(第一个片段)一样有效。有人可以告诉我这样做是否有什么问题:

- (NSArray *)myArray {
  return _myArray = _myArray ? _myArray : [NSArray array];
}

最后一个片段与您发布的第一个片段具有相同的效果。

作为一种改进,虽然没有像这样的运算符||=在 Objective-C 中,您可以省略三元 if 运算符的第二个参数并执行

return _myArray = _myArray ?: [NSArray array];

这完全相当于

return _myArray = _myArray ? _myArray : [NSArray array];

这是现代版本都支持的语言扩展gcc http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Conditionals.html#Conditionals and clang http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html.

奖励:如果你想节省更多的击键次数,你可以这样做

- (NSArray *)myArray {
    return _myArray = _myArray ?: @[];
}

附带说明一下,跳过中间操作数也有一些好处。

例如在本例中

id x = [self someMethod] ? [self someMethod] : [self anotherMethod];

if someMethod评估为true它将被调用两次,而做

id x = [self someMethod] ?: [self anotherMethod];

它只会被调用一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby ||= Objective-C 中的等效项 的相关文章

随机推荐