#识别Ruby中识别方法的约定的原理/历史是什么?
-
30-09-2019 - |
题
例如,我一直认为方法称为 String#split
, ,但从来没有 String.split
, ,这似乎更合乎逻辑。甚至甚至 String::split
, ,因为你可以考虑 #split
在命名空间 String
. 。当假设/暗示课程时,我什至单独看到该方法(#split
).
我知道这是RI中方法确定方法的方式。哪个是第一个?
这是否可以从字段中区分出来?我还听说这有助于将实例方法与类方法区分开。但是这从哪里开始?
解决方案
差异表示您如何访问方法。
类方法 使用 ::
分隔符指示该消息可以发送到类/模块对象,而 实例方法 使用 #
分隔器指示可以将消息发送到实例对象。
我要选择 Complex
类(在Ruby 1.9中)以演示差异。你们都有 Complex::rect
和 Complex#rect
. 。这些方法具有不同的ARITH,它们的目的完全不同。 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
.
至于为什么他们选择 ::
和 #
? ::
对我来说很有意义,因为它常规分离了名称空间,但是 #
可能只是其他命名法中未使用的符号,可以明确地将其视为实例方法分离器。
其他提示
我知道这是RI中方法确定方法的方式。哪个是第一个?
是的,这是它的来源。当您使用时 #
, ,它会自动超越您的方法,因此对文档中其他方法的引用开始由 #
符号。看 这里:
类,源文件和任何包含下划线或先前为哈希字符之前的方法名称自动从注释文本中自动超链接到其描述。
但是,您实际上不能以这种方式调用一种方法。但这不足为奇。毕竟, <cref ...>
尽管是有效的文档标签,但在C#中还是无效的语句。