相当于其他语言中 ruby 的方法名称的感叹号
在 Ruby 中,具有副作用的方法或更改作为参数传递的对象的方法带有“!” 作为后缀。
例如:
"SomeString".gsub!(/S/, "s")
将更改 String 对象,而"SomeString".gsub(/S/, "s")
将作用于 String 对象的副本,并且不会更改该方法之外的任何对象的状态。
我喜欢这个约定,并且我也想在使用其他语言编程时使用它。
我的问题:
In Ruby, methods with side effects or methods that change the object passed as parameters have "!" as a postfix.
For example:
"SomeString".gsub!(/S/, "s")
would be changing the String object, while"SomeString".gsub(/S/, "s")
would work on a copy of the String object, and would not change the state of any objects outside of the method.
I like this convention, and I'd like to use it when programming in other languages, too.
My question:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Bang 方法并不意味着“改变接收器”。
http://www.wobblini.net/bang.txt
如您所见,Matz 的意图是它们意思是“比没有感叹号的版本更危险”。 只是一般性仅供参考,到目前为止看到的大多数答案都提到更换接收器。
Bang methods are not intended to mean "changing the receiver".
http://www.wobblini.net/bang.txt
As you can see, Matz intended them to mean "more dangerous than the version without an exclamation mark". Just a general FYI, seeing most of the answers so far mentions changing the receiver.
在Scheme中,具有副作用的方法或改变作为参数传递的对象的方法带有“!” 作为后缀。 作为谓词的方法有一个“?”。 其他 lisp 有时也使用这种约定。
在 Java 中,通常对于改变其接收者的过程使用返回类型
void
,而对于不改变接收者的函数则返回计算值。 (例如:String.toLowerCase() 返回一个新字符串,Collections.sort(List) 就地排序并且不返回值)。 然而,这不是一个严格的习惯用法,因为变异过程通常也需要返回一个值。In Scheme, methods with side effects or methods that change the object passed as parameters have "!" as a postfix. Methods which are predicates have a "?". Other lisps also sometimes use this convention.
In Java, it's common to have the return type
void
for a procedure which mutates its receiver, and to return the computed value for a function which does not. ( eg: String.toLowerCase() returns a new string, Collections.sort(List) sorts in place and does not return a value ). However, this isn't a rigorous idiom, as often mutating procedures also need to return a value.我只能谈论我使用过的语言,但是...我不熟悉 Python、Perl、Java、PHP、Javascript 或 Bash(shell)脚本中的任何此类约定。
一些程序员可能会发现在函数名称上添加一些前缀或后缀很有用,以指示那些改变其参数的函数与那些创建参数的新“版本”并返回它们的函数。 如果你是这些人中的一员,那就继续吧。 但同样,我不知道任何标准(除了 Steven 在 C 和 C++ 中提到的 const 东西)。
I can only speak about the languages I've used, but... I'm not familiar with any such convention in Python, Perl, Java, PHP, Javascript, or Bash (shell) scripting.
Some programmers might find it useful to put some prefix or postfix on function names to indicate those that mutate their arguments vs. those that create new "versions" of the arguments and return them. If you're one of those people, go right ahead. But again, I'm not aware of anything standard (except for the
const
thing Steven mentioned in C and C++).其他语言(特别是 C++)有一个标记参数的约定。 调用方法时,用const标记不会改变的参数:eg
There is a convention for marking parameters in other languages (C++ specifically). When calling a method, mark parameters that will not be changed with const: e.g.