Ruby 是否有类似于 .= 的东西,比如 +=



因为可以做到:

a += 1

我在想是否也可以做类似的事情:

a .= 1

例如,用例是使用ActiveRecord:

query = Model
query .= where(name: 'John') # instead of query = query.where(name: 'John')

这可能吗?

不,Ruby 没有这样的东西。Ruby 语法只允许某些"复合运算符",而此运算符不在其中。

但是,在特定情况下可能会有解决方法(尽管不是这个(。如果,比如说,你有一个数组,那么而不是

ary = ary.select { ... } if foo
ary = ary.select { ... } if bar
ary = ary.compact

你可以做到

ary.select! { ... } if foo
ary.select! { ... } if bar
ary.compact!

(这可能会产生意想不到的后果,是的,因为就地突变通常是危险的。但在某些情况下,这是可取的。不要这样做来缩短你的代码。

Ruby能够自动检测行延续:

query = Model
  .where(name: 'John')
  .select(:first_name)

这相当于这个(点在末尾(:

query = Model.
  where(name: 'John').
  select(:first_name)

请注意,由于 IRB 中计算行的方式,只有第二种语法(行尾的点(按预期工作。对于第一个示例,IRB 会在看到换行符后立即评估该行。在 Ruby 脚本中,这两个选项都运行良好。

这里应用了不同的风格考虑,人们对哪一个最好有不同的看法。

通常,此方法要求组合行在语法上等效于单行。不能以这种方式使用内联条件。因此,这将是无效的语法:

query = Model
  .where(name: 'John') if some_condition
  .select(:first_name)

如果您需要这些条件,可以将中间结果分配给局部变量,如Sergio Tulentsev在他的答案中所示。你经常会看到这个,它根本不是代码气味。

相关内容

最新更新