在Ruby中识别方法的#约定的基本原理/历史是什么?

例如,我总是看到称为String#split ,但从来没有看过String.split ,这似乎更符合逻辑。 或者甚至可能是String::split ,因为你可以认为#splitString的命名空间中。 当假定/隐含类( #split )时,我甚至独自看过这个方法。

我知道这是在ri中识别方法的方式。 哪个先来?

这是区分,例如,来自字段的方法? 我也听说这有助于区分实例方法和类方法。 但这是从哪里开始的?

差异表明您如何访问这些方法。

类方法使用:: separator指示可以将消息发送到类/模块对象,而实例方法使用#separator来指示可以将消息发送到实例对象。

我将选择Complex类(在Ruby 1.9中)来演示差异。 你有Complex::rectComplex#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 `
'

我认为他们不使用的原因. 作为一切的分隔符,无论方法属于类还是实例,它都是不明确的。 现在我已经习惯了Ruby这样做,实际上我认为这是其他语言惯例的一个缺点,说实话。

此外,这与某些字段完全无关,因为您可以发送的所有邮件都是正确的消息,即使它看起来像是一个可公开访问的字段。 当然,你最接近字段的是属性或实例变量,它们总是以@为前缀,除非你使用inheritance或Object#instance_variable_get / _set否则不能直接从实例外部访问。

至于具体为什么他们选择::#::对我有意义,因为它通常会分隔名称空间,但#可能只是一个未在其他命名法中使用的符号,可以明确地被识别为实例方法分隔符。

我知道这是在ri中识别方法的方式。 哪个先来?

是的,这就是它的来源。 当您使用# ,它会自动超链接您的方法,因此对文档中其他方法的引用开始以#符号为前缀。 看到这里

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

但是,您无法以这种方式实际调用方法。 但这不应该令人惊讶; 毕竟, 是C#中的无效语句,尽管它是有效的文档标记。