例如,我总是看到称为String#split
的方法,但从不String.split
,这似乎更合乎逻辑。或者甚至可能是String::split
,因为您可以将#split
视为String
的命名空间。当假定/暗示类(#split
)时,我甚至独自看过这个方法。
我知道这是在ri中识别方法的方式。哪个先来了?
这是区分,例如,来自字段的方法吗? 我也听说这有助于区分实例方法和类方法。但这是从哪里开始的?
答案 0 :(得分:8)
差异表明您如何访问这些方法。
类方法使用::
分隔符指示可以将消息发送到类/模块对象,而实例方法使用{{1}分隔符,表示可以将消息发送到实例对象。
我将选择#
类(在Ruby 1.9中)来演示差异。您同时拥有Complex
和Complex::rect
。这些方法具有不同的特征,它们用于完全不同的目的。 Complex#rect
采用实数和虚数参数,返回Complex::rect
的新实例,而Complex
返回实例的实部和虚部的数组。
Complex#rect
我认为他们不使用ruby-1.9.1-p378 > x = Complex.rect(1,5)
=> (1+5i)
ruby-1.9.1-p378 > x.rect
=> [1, 5]
ruby-1.9.1-p378 > x.rect(2, 4) # what would this even do?
ArgumentError: wrong number of arguments(2 for 0)
from (irb):4:in `rect'
from (irb):4
from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>'
作为所有内容的分隔符的原因是,该方法是属于类还是实例是不明确的。现在我已经习惯了Ruby这样做,实际上我认为这是其他语言惯例的一个缺点,说实话。
此外,这与字段有些完全不相关的主题,因为即使看起来像公共可访问字段一样,您可以发送的所有邮件都是邮件。当然,您对字段最接近的是属性或实例变量,它们始终以.
为前缀,并且不能直接从实例外部访问,除非您使用继承或{{ 1}} / @
。
至于他们选择Object#instance_variable_get
和_set
的具体原因? ::
对我有意义,因为它通常会分隔名称空间,但#
可能只是一个未在其他术语中使用的符号,可以毫不含糊地被识别为实例方法分隔符。
答案 1 :(得分:3)
我知道这是在ri中识别方法的方式。哪个先来了?
是的,这就是它的来源。当您使用#
时,它会自动超链接您的方法,因此对文档中其他方法的引用开始以#
符号为前缀。见 here :
类的名称,源文件以及包含下划线或以哈希字符开头的任何方法名称会自动从注释文本超链接到其描述。
但是,您无法以这种方式实际调用方法。但这不应该令人惊讶;毕竟,<cref ...>
是C#中的无效语句,尽管它是有效的文档标记。