在Ruby中,带有副作用的方法或改变作为参数传递的对象的方法都有“!”作为后缀。
例如:
"SomeString".gsub!(/S/, "s")
将改变String对象,而
"SomeString".gsub(/S/, "s")
将处理String对象的副本,并且不会更改方法之外的任何对象的状态。
我喜欢这个惯例,我也想在用其他语言编程时使用它。
我的问题:
答案 0 :(得分:7)
Bang方法并不意味着“改变接收器”。
http://www.wobblini.net/bang.txt
正如你所看到的,Matz的意思是“比没有感叹号的版本更危险”。只是一个普通的FYI,看到目前为止大多数答案提到改变接收器。
答案 1 :(得分:3)
在Scheme中,带有副作用的方法或改变作为参数传递的对象的方法都有“!”作为后缀。作为谓词的方法具有“?”。其他lisps有时也使用这种惯例。
在Java中,对于一个改变其接收者的过程,返回类型void
是常见的,并且返回没有的函数的计算值。 (例如:String.toLowerCase()返回一个新字符串,Collections.sort(List)就地排序并且不返回值)。然而,这不是一个严谨的习惯用法,因为经常变异的程序也需要返回一个值。
答案 2 :(得分:2)
我只能谈论我使用的语言,但是......我不熟悉Python,Perl,Java,PHP,Javascript或Bash(shell)脚本中的任何此类约定。
有些程序员可能会发现在函数名称上加上一些前缀或后缀来指示那些改变他们的参数的东西与那些创建参数的新“版本”并返回它们的东西是有用的。如果你是这些人之一,那就去吧。但同样,我不知道任何标准(除了在C和C ++中提到的const
史蒂文)。
答案 3 :(得分:1)
有一种用于标记其他语言参数的约定(特别是C ++)。调用方法时,标记不会用const更改的参数:例如
void doSomething( const int ¶meter )