【发布时间】:2009-03-17 08:06:53
【问题描述】:
在 Ruby 中,具有副作用的方法或更改作为参数传递的对象的方法带有“!”作为后缀。
例如:
"SomeString".gsub!(/S/, "s")
将更改字符串对象,而"SomeString".gsub(/S/, "s")
将作用于 String 对象的副本,并且不会更改方法之外的任何对象的状态。
我喜欢这个约定,我也想在用其他语言编程时使用它。
我的问题:
【问题讨论】:
在 Ruby 中,具有副作用的方法或更改作为参数传递的对象的方法带有“!”作为后缀。
例如:
"SomeString".gsub!(/S/, "s")
将更改字符串对象,而"SomeString".gsub(/S/, "s")
将作用于 String 对象的副本,并且不会更改方法之外的任何对象的状态。
我喜欢这个约定,我也想在用其他语言编程时使用它。
我的问题:
【问题讨论】:
Bang 方法并不意味着“更换接收器”。
http://www.wobblini.net/bang.txt
如您所见,Matz 的意思是“比没有感叹号的版本更危险”。仅供参考,目前看到的大多数答案都提到了更换接收器。
【讨论】:
在Scheme中,具有副作用的方法或更改作为参数传递的对象的方法带有“!”作为后缀。作为谓词的方法有一个“?”。其他 lisp 有时也使用这种约定。
在 Java 中,对于改变其接收者的过程来说,返回类型 void 是很常见的,而对于不改变其接收者的函数来说,返回计算值是很常见的。 (例如: String.toLowerCase() 返回一个新字符串, Collections.sort(List) 就地排序并且不返回值)。但是,这不是一个严格的习惯用法,因为变异过程通常也需要返回一个值。
【讨论】:
我只能谈论我使用过的语言,但是...我不熟悉 Python、Perl、Java、PHP、Javascript 或 Bash (shell) 脚本中的任何此类约定。
一些程序员可能会发现在函数名称上放置一些前缀或后缀很有用,以指示改变其参数的那些与创建参数的新“版本”并返回它们的那些。如果你是这些人中的一员,请继续前进。但同样,我不知道任何标准(除了const Steven 在 C 和 C++ 中提到的东西)。
【讨论】:
在其他语言(特别是 C++)中标记参数有一个约定。调用方法时,用 const 标记不会改变的参数:e.g.
void doSomething( const int ¶meter )
【讨论】: