Ruby:“ variable.property!”语法的含义是什么?

问题描述 投票:1回答:2

我正在分析用ruby编写的代码块。我不懂该语言,需要了解一种操作。

def restore
  m = ObjectName.where(prop: User.where(email: '[email protected]').first.element_id).last
  m.todo!
  m.waiting!
  ...
end

什么是“ m.todo!”和“等待中!”是做?我不知道它是在分配“真”值还是与当前值相反的值,例如:m.todo =!m.todo

非常感谢

ruby syntax variable-assignment operator-keyword
2个回答
2
投票

!?是Ruby中方法名称的有效部分。它们没有任何特殊含义,尽管!通常用于变异或破坏性动作,?通常用于谓词方法。

在此示例中,有两个名为todo!waiting!的方法被调用-别无所求。如果我不得不猜测的话,那些方法只是执行组合的“更新状态变量并保存”操作(因此,是可变的)。


0
投票

在Ruby中,foo.bar消息发送的语法。它将首先计算表达式foo(正在取消引用局部变量或发送给隐式接收器self的无接收器消息),然后将消息bar发送到结果对象。

[一旦您知道Ruby中发送的消息是什么样子,就很容易看到m.todo!的作用:它将首先对表达式m求值(它是取消引用局部变量或发送给隐式接收器的无接收器的消息) self),然后将消息todo!发送到结果对象。

!结尾的方法名称通常用于标记一对方法的“更令人惊讶”。因此,如果您有two方法,两者都做类似的事情,那么结尾处有一个爆炸的方法就是“更令人惊讶”的方法。 Process::exitProcess::exit是一个很好的例子。两者都退出当前正在运行的Ruby进程,但是“普通”版本(即没有爆炸的版本)正常运行出口处理程序,而“令人惊讶”版本立即退出without运行出口处理程序。

注意:关于bang方法的命名约定似乎有很多误解。所以,让我说清楚:

  1. Bang方法与突变或破坏绝对无关。这简直就是惊喜。请参阅上面的Process::exit!示例,该示例与突变无关。
  2. 爆炸方法始终与非爆炸方法配对。它们标志着一对方​​法的“更令人惊讶”的变体。如果没有一对方法,就不会有爆炸。例如,参见Process::exit!,其中的[[does具有爆炸声,因为它是Process::exit!的更令人惊讶的变体,因为它使接收者发生了变异。但是,Array#collect!确实会爆炸,即使它也使接收者发生变异,因为没有相应的“不足为奇”的方法。
© www.soinside.com 2019 - 2024. All rights reserved.