例如,我总是看到称为String#split
,但从来没有String.split
,这似乎更符合逻辑。或者甚至可能String::split
,因为你可以考虑#split
位于命名空间中String
。当类被假定/隐含时,我什至单独看到了该方法(#split
).
我知道这是 ri 中识别方法的方式。哪一个先出现?
例如,这是为了区分方法和字段吗?
我还听说这有助于区分实例方法和类方法。但这是从哪里开始的呢?
差异表明您如何访问这些方法。
类方法使用::
分隔符指示消息可以发送到类/模块对象,而实例方法使用#
分隔符以指示消息可以发送到实例对象。
我要选择的是Complex
类(在 Ruby 1.9 中)来演示差异。你两者都有Complex::rect
and Complex#rect
。这些方法有不同的数量,并且它们服务于完全不同的目的。Complex::rect
接受一个实数和一个虚数参数,返回一个新实例Complex
, while 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 这样做,老实说,我实际上认为这是其他语言约定的一个缺点。
此外,这在某种程度上是一个完全不相关的话题fields因为正确地说,你可以发送的所有消息都是消息,即使它looks就像一个可公开访问的领域。当然,最接近字段的是属性或实例变量,它们总是以前缀@
并且不是directly除非您使用继承或从实例外部访问Object#instance_variable_get
/_set
.
至于具体为什么选择::
and #
? ::
对我来说很有意义,因为它通常分隔名称空间,但是#
可能只是一个未在其他命名法中使用的符号,并且可以明确地被识别为实例方法分隔符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)