为什么Ruby文档中的方法前面有一个井号?

Ed *_* S. 56 ruby documentation

这一直困扰着我一段时间.当我看到任何以文本打印的Ruby方法时,它通常显示为:

Class#method
Run Code Online (Sandbox Code Playgroud)

要么

#method
Run Code Online (Sandbox Code Playgroud)

现在,我会用:

Class.method
Run Code Online (Sandbox Code Playgroud)

为什么所有Ruby方法都以井号开头?有什么理由吗?只是好奇.

Sim*_*son 101

请注意,惯例是:

Class#method
Run Code Online (Sandbox Code Playgroud)

而不是

object#method
Run Code Online (Sandbox Code Playgroud)

在代码中你将拥有object.method,如果object是一个实例class.该#约定不在代码中使用.

RDoc文档:

使用::来描述类方法,#用于描述实例方法和使用.例如代码.


dst*_*rkr 28

#表示法用于表示规范instance方法,如String#upcase.的.符号用于表示特定实例的方法,如mystring.upcase.区别在于并不意味着存在类方法"upcase".


Jör*_*tag 19

我刚刚意识到其他答案都没有触及问题中最微不足道的方面:为什么这个#标志?

我有两个理论:

  1. 它可能来自Smalltalk,其中符号是在Ruby 中编写的#sym(而不是:sym).所以,如果你想引用一个Method 对象(而不是调用一个方法),那么你会调用类似的东西Array >> #new.(这>>本身就是一个返回传递给它的方法的方法.所以,在Ruby中就是这样Array.method :new.)In Smalltalk文档,方法通常被称为Class>>method,但在Ruby中Class:method会更有意义,除了它很容易混淆Class::method.因此,Class#method被选中了.
  2. 我的另一个理论是,它只是被选中,因为它#是Ruby中的注释字符.

一个明确的答案只能由发明该惯例的人给出.如果它是为编程Ruby书而发明的,那将是Dave Thomas或Andy Hunt,但我有点怀疑.这本书于2001年出版,Ruby于1993年开始,他们之前是如何引用方法的?

  • 也许它模仿了 HTML 中 # 锚点语法的外观。例如 http://www.somesite.com/somepage#section。 (3认同)
  • 我听说,务实的程序员也为Ruby创建了文档(他们想播种该文档,以便其他人被“愚弄”为添加文档)。git可以带您回到1998年,因此您可以检查prag progs在添加它之前是否发生了Class#method_name。 (2认同)
  • @BHS我是第二个.如果没有选择_why_`#`的任何确定资源,我总是发现最可能的解释是用于跳转到文档中的特定方法的锚 - Java广泛认为使用相同的约定起源也是. (2认同)

Sar*_*Mei 16

来自rdoc文档:

类的名称,源文件以及包含下划线或以哈希字符开头的任何方法名称都会自动从注释文本超链接到其描述.

(重点补充.)


小智 7

您列出的所有答案都是正确的.我要补充的一件事是你说的文档风格会让你更喜欢

Class.method

很容易与类方法混淆.因为您可以使用上面的语法在ruby中调用类方法:

class Foo
  def self.say_hi
    puts "hi"
  end
end

Foo.say_hi    # => prints "hi"
Run Code Online (Sandbox Code Playgroud)


ioq*_*tix 5

哈希符号在2000年12月首次发布的“ Programming Ruby-The Pragmatic Programmer's Guide”中得到了介绍。

“序言”包含“符号约定”

在本文中,Fred#doIt是对的实例方法(doIt)的引用class Fred,而Fred.new[在其他Ruby文档中,您可能会看到类方法写为Fred::new。这是完全有效的Ruby语法;我们只是碰巧觉得Fred.new读起来不太分散注意力。]是一个类方法,并且Fred::EOF是一个类常量。

在2004年10月发布的第二版中对此进行了澄清:

在本文中,Fred#do_something是对的实例方法(在本例中为do_something)的引用class FredFred.new是类方法,并且Fred::EOF是类常量。使用哈希字符指示实例方法的决定是一个艰难的决定:这不是有效的Ruby语法,但是我们认为区分实例和特定类的类方法很重要。当您看到我们写的内容时File.read,您就知道我们在谈论类方法read。取而代之的File#read是,我们指的是实例方法read

Ruby本身使用以下表示法:

> rvm use 1.9.3
Using ruby-1.9.3-p551

> Object.instance_method(:initialize)
=> #<UnboundMethod: Object(BasicObject)#initialize>
Run Code Online (Sandbox Code Playgroud)

它是由Matz在2002年2月引入并正式化的:

commit 8210c254bee19294af67bcee0e8f5e02ebb39a60
Author: matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date:   Tue Feb 5 07:56:31 2002 +0000

    * io.c (fptr_finalize): should raise error when fclose fails.

    * eval.c (method_inspect): proper output format to distinguish
      methods and singleton methods.


    git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2046 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Run Code Online (Sandbox Code Playgroud)