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
我刚刚意识到其他答案都没有触及问题中最微不足道的方面:为什么这个#标志?
我有两个理论:
#sym(而不是:sym).所以,如果你想引用一个Method 对象(而不是调用一个方法),那么你会调用类似的东西Array >> #new.(这>>本身就是一个返回传递给它的方法的方法.所以,在Ruby中就是这样Array.method :new.)In Smalltalk文档,方法通常被称为Class>>method,但在Ruby中Class:method会更有意义,除了它很容易混淆Class::method.因此,Class#method被选中了.#是Ruby中的注释字符.一个明确的答案只能由发明该惯例的人给出.如果它是为编程Ruby书而发明的,那将是Dave Thomas或Andy Hunt,但我有点怀疑.这本书于2001年出版,Ruby于1993年开始,他们之前是如何引用方法的?
小智 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)
哈希符号在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 Fred,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>
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)
| 归档时间: |
|
| 查看次数: |
13874 次 |
| 最近记录: |