gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:49:44 25 4
gpt4 key购买 nike

例如,我一直看到称为 String#split 的方法,但从未见过 String.split,这似乎更合乎逻辑。或者甚至可能是 String::split,因为您可以认为 #split 位于 String 的命名空间中。当假定/隐含类 (#split) 时,我什至单独看到了该方法。

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

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

最佳答案

不同之处在于您如何访问这些方法。

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

我将选择 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 这样做,老实说,我实际上认为这是其他语言约定的缺点。

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

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

关于ruby - # Ruby 中识别方法约定的基本原理/历史是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3123445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com