相当于其他语言中 ruby​​ 的方法名称的感叹号

发布于 2024-07-15 20:11:18 字数 410 浏览 6 评论 0原文

在 Ruby 中,具有副作用的方法或更改作为参数传递的对象的方法带有“!” 作为后缀。

例如:

"SomeString".gsub!(/S/, "s")
将更改 String 对象,而
"SomeString".gsub(/S/, "s")
将作用于 String 对象的副本,并且不会更改该方法之外的任何对象的状态。

我喜欢这个约定,并且我也想在使用其他语言编程时使用它。

我的问题:

  • 真正的 Ruby 程序员(我不是;-))真的使用这个约定吗? 如果没有,为什么不呢?
  • Java、PHP、Perl、Cobol... 中的方法命名是否有等效约定?

  • 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:

  • Do real Ruby programmers (I'm not one;-)) actually use this convention? If not, why not?
  • Are there equivalent conventions for naming methods in Java, PHP, Perl, Cobol...?

  • 如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

    评论(4

    不…忘初心 2024-07-22 20:11:18

    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.

    友欢 2024-07-22 20:11:18

    在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.

    滥情稳全场 2024-07-22 20:11:18

    我只能谈论我使用过的语言,但是...我不熟悉 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++).

    记忆消瘦 2024-07-22 20:11:18

    其他语言(特别是 C++)有一个标记参数的约定。 调用方法时,用const标记不会改变的参数:eg

    void doSomething( const int ¶meter )
    

    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.

    void doSomething( const int ¶meter )
    
    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文