我正在分析用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中方法名称的有效部分。它们没有任何特殊含义,尽管!
通常用于变异或破坏性动作,?
通常用于谓词方法。
在此示例中,有两个名为todo!
和waiting!
的方法被调用-别无所求。如果我不得不猜测的话,那些方法只是执行组合的“更新状态变量并保存”操作(因此,是可变的)。
在Ruby中,foo.bar
是消息发送的语法。它将首先计算表达式foo
(正在取消引用局部变量或发送给隐式接收器self
的无接收器消息),然后将消息bar
发送到结果对象。
[一旦您知道Ruby中发送的消息是什么样子,就很容易看到m.todo!
的作用:它将首先对表达式m
求值(它是取消引用局部变量或发送给隐式接收器的无接收器的消息) self
),然后将消息todo!
发送到结果对象。
以!
结尾的方法名称通常用于标记一对方法的“更令人惊讶”。因此,如果您有two方法,两者都做类似的事情,那么结尾处有一个爆炸的方法就是“更令人惊讶”的方法。 Process::exit
和Process::exit
是一个很好的例子。两者都退出当前正在运行的Ruby进程,但是“普通”版本(即没有爆炸的版本)正常运行出口处理程序,而“令人惊讶”版本立即退出without运行出口处理程序。
注意:关于bang方法的命名约定似乎有很多误解。所以,让我说清楚:
Process::exit!
示例,该示例与突变无关。Process::exit!
,其中的[[does具有爆炸声,因为它是Process::exit!
的更令人惊讶的变体,因为它使接收者发生了变异。但是,Array#collect!
确实会爆炸,即使它也使接收者发生变异,因为没有相应的“不足为奇”的方法。