9

例如,我总是看到方法被称为String#split, 但从不String.split,这似乎更合乎逻辑。甚至可能String::split,因为您可以考虑#splitString. 当类被假定/隐含()时,我什至单独看到了该方法#split

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

这是为了区分例如方法和字段吗?我还听说这有助于区分实例方法和类方法。但这是从哪里开始的呢?

4

2 回答 2

8

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

类方法使用::分隔符表示可以将消息发送到类/模块对象,而实例方法使用#分隔符表示可以将消息发送到实例对象。

我将选择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 `<main>'

我认为它们不用.作所有内容的分隔符的原因是该方法属于类还是实例是不明确的。现在我已经习惯了 Ruby 这样做,老实说,我实际上认为它是其他语言约定的一个缺点。

此外,这在某种程度上与字段完全无关,因为您可以发送的所有消息都是消息,正确地说,即使它看起来像一个可公开访问的字段。当然,与字段最接近的东西是属性或实例变量,它们总是带有前缀@并且不能从实例外部直接访问,除非您使用继承或Object#instance_variable_get/ _set

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

于 2010-06-26T12:32:54.783 回答
3

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

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

类的名称、源文件以及任何包含下划线或前面带有井号字符的方法名称都会自动从注释文本超链接到它们的描述。

但是,您实际上不能以这种方式调用方法。但这不足为奇。毕竟,<cref ...>尽管是有效的文档标记,但它在 C# 中是无效的语句。

于 2010-06-26T12:45:16.993 回答