当我看到任何 Ruby 方法在文本中打印时,通常会显示为:
Class#method
或者
#method
现在,我会使用:
Class.method
为什么所有的 Ruby 方法都以井号开头?这有什么原因吗?
当我看到任何 Ruby 方法在文本中打印时,通常会显示为:
Class#method
或者
#method
现在,我会使用:
Class.method
为什么所有的 Ruby 方法都以井号开头?这有什么原因吗?
请注意,惯例是:
Class#method
而不是
object#method
在代码中,如果object
是class
的实例,你会写成object.method
。在代码中不使用#
约定。
根据RDoc文档:
使用::描述类方法,#描述实例方法,.用于示例代码。
#符号用于引用规范的instance
方法,例如String#upcase
。点符号用于引用特定实例的方法,例如mystring.upcase
。这样做是为了不暗示类方法'upcase'的存在。
我刚意识到其他回答中没有碰到这个问题最微不足道的方面: 为什么使用 #
符号?
我有两个理论:
#sym
(而不是像 Ruby 中的 :sym
)。因此,如果您想要 引用 方法 对象(而不是调用方法),那么您将调用类似于 Array >> #new
的东西。(>>
本身就是一种返回传递给它的方法的方法。因此,在 Ruby 中,这将是 Array.method :new
。)在 Smalltalk 文档中,方法通常被称为 Class>>method
,但在 Ruby 中,Class:method
更合理,除了它很容易与 Class::method
混淆。因此,选择了 Class#method
。#
,因为在 Ruby 中它是注释字符。只有发明这个约定的人才能给出明确的答案。如果它是为《Programming Ruby》书而发明的,那么可能是 Dave Thomas 或 Andy Hunt,但我有点怀疑。该书出版于 2001 年,Ruby 开始于 1993 年,他们在那之前是如何引用方法的呢?
Class#method_name
是否在实用主义程序员添加之前就存在。 - Andrew Grimm#
的情况下,我一直认为最可能的解释是用于跳转到文档中特定方法的锚点——Java 也被广泛认为起源于此。 - javawizard这在2004年10月出版的第二版中得到了澄清。在文本中,
Fred#doIt
是对class Fred
的实例方法(doIt
)的引用,而Fred.new
[在其他一些 Ruby 文档中,您可能会看到类方法写成Fred::new
。这是完全有效的 Ruby 语法;我们只是觉得Fred.new
更不容易分心。] 是一个类方法,而Fred::EOF
是一个类常量。
Fred#do_something
是对class Fred
的实例方法(在此情况下是do_something
)的引用,Fred.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>
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
以上所有答案都是正确的。我要补充的一点是,你所说的文档风格
Class.method
很容易与类方法混淆。因为在Ruby中,你可以使用上述语法调用类方法:
class Foo
def self.say_hi
puts "hi"
end
end
Foo.say_hi # => prints "hi"
href="Component.html#getComponentAt(int, int)"
。@see package.class#member [optional label]
{@link package.class#member [optional label]}