【问题标题】:Equivalent to exclamation mark for method names from ruby in other languages相当于其他语言的ruby方法名的感叹号
【发布时间】:2009-03-17 08:06:53
【问题描述】:

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

例如:

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

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

我的问题:

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

      标签: ruby naming-conventions


      【解决方案1】:

      Bang 方法并不意味着“更换接收器”。

      http://www.wobblini.net/bang.txt

      如您所见,Matz 的意思是“比没有感叹号的版本更危险”。仅供参考,目前看到的大多数答案都提到了更换接收器。

      【讨论】:

      • 我真的认为“更危险”是“将更换接收器”的一种可爱方式。我见过的所有 ruby​​ 代码都证实了这一点
      • 很好,现在我知道这些方法被称为“bang 方法”。不过,我不喜欢“危险方法”的概念。对我来说听起来很主观。
      • Iraimbilanja:并非如此,有很多方法可以毫不费力地更改接收器(例如 Enumerable#delete_if)。关键是你不应该有一个 bang 方法,除非你有一个 non-bang 等价物。仅更换接收器不足以证明爆炸的合理性。
      【解决方案2】:

      在Scheme中,具有副作用的方法或更改作为参数传递的对象的方法带有“!”作为后缀。作为谓词的方法有一个“?”。其他 lisp 有时也使用这种约定。

      在 Java 中,对于改变其接收者的过程来说,返回类型 void 是很常见的,而对于不改变其接收者的函数来说,返回计算值是很常见的。 (例如: String.toLowerCase() 返回一个新字符串, Collections.sort(List) 就地排序并且不返回值)。但是,这不是一个严格的习惯用法,因为变异过程通常也需要返回一个值。

      【讨论】:

        【解决方案3】:

        我只能谈论我使用过的语言,但是...我不熟悉 Python、Perl、Java、PHP、Javascript 或 Bash (shell) 脚本中的任何此类约定。

        一些程序员可能会发现在函数名称上放置一些前缀或后缀很有用,以指示改变其参数的那些与创建参数的新“版本”并返回它们的那些。如果你是这些人中的一员,请继续前进。但同样,我不知道任何标准(除了const Steven 在 C 和 C++ 中提到的东西)。

        【讨论】:

          【解决方案4】:

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

          void doSomething( const int &parameter )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-23
            • 2010-10-11
            • 1970-01-01
            • 2015-03-09
            • 1970-01-01
            • 2022-01-23
            • 2015-05-01
            • 1970-01-01
            相关资源
            最近更新 更多