因为可以做到:
a += 1
我在想是否也可以做类似的事情:
a .= 1
用例例如是ActiveRecord:
query = Model
query .= where(name: 'John') # instead of query = query.where(name: 'John')
这有可能吗?
答案 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在答案中所示。您经常会看到这一点,而且根本不是代码味道。