Ruby有类似于。=,类似+ =?

时间:2017-05-09 20:41:32

标签: ruby

因为可以做到:

a += 1

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

a .= 1

用例例如是ActiveRecord:

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

这有可能吗?

2 个答案:

答案 0 :(得分:6)

不,红宝石没有这样的东西。只有某些"复合运营商" Ruby语法是允许的,而且这个运算符不在其中。

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

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

你能够做到

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

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

答案 1 :(得分:6)

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在答案中所示。您经常会看到这一点,而且根本不是代码味道。