Jus*_* L. 9 ruby convention methods identifier rdoc
例如,我总是看到所谓的方法String#split,但从来没有String.split,这似乎更合乎逻辑.或者甚至可能String::split,因为你可以考虑#split在名称空间中String.当假设/隐含(#split)时,我甚至独自看过这个方法.
我知道这是在ri中识别方法的方式.哪个先来?
这是区分,例如,来自领域的方法吗?我也听说这有助于区分实例方法和类方法.但这是从哪里开始的?
差异表明您如何访问这些方法.
类方法使用::分隔符指示消息可以发送到类/模块对象,而实例方法使用#分隔符指示消息可以发送到实例对象.
我将选择Complex类(在Ruby 1.9中)来演示差异.你有两个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这样做,实际上我认为这是其他语言惯例的一个缺点,说实话.
此外,这与某些字段完全无关,因为您可以发送的所有邮件都是正确的消息,即使它看起来像是一个可公开访问的字段.当然,您对字段最接近的是属性或实例变量,除非您使用继承或/,否则它们始终以实例外部为前缀@并且无法直接从实例外部访问.Object#instance_variable_get_set
至于具体为什么他们选择::和#?  ::对我有意义,因为它通常是分隔名称空间,但#可能只是一个未在其他术语中使用的符号,可以毫不含糊地被识别为实例方法分隔符.
| 归档时间: | 
 | 
| 查看次数: | 772 次 | 
| 最近记录: |