gpt4 book ai didi

ruby:类实例变量与实例变量

转载 作者:数据小太阳 更新时间:2023-10-29 07:41:59 24 4
gpt4 key购买 nike

我的想法是为来自 java 背景的人创建一个社区 wiki,因为阅读了很多解释,直到我实际尝试了一些东西和片段之前我无法理解任何东西拼图开始寻找自己的位置。但我首先需要确保我做对了。出于这样的背景,我很困惑地发现 @variable 可能意味着 2 个截然不同的东西。这是一个例子:

class Test
@ins = "gah"
def self.ins
puts @ins
end

def initialize()
@ins = "wtf?"
end
def ins2
puts @ins
end
end

据我了解,第一个@ins 是表示类Test 的对象的实例变量。第二个 @insTest 类对象中的实例变量。

现在我开始明白一些事情了。这里有几个例子:

[14] pry(main)> test.ins2
wtf?

我们正在调用一个对象的方法,它返回对象的实例变量。

[15] pry(main)> test.ins
NoMethodError: undefined method `ins' for #<Test:0x000000017d9348 @ins="wtf?">

我们试图通过一个对象调用一个类方法,这个方法是类的,所以我们得到 NoMethodError

[16] pry(main)> Test.ins
gah

我们正在调用一个类方法,以便它正确地看到类对象的实例变量。

[17] pry(main)> Test.ins2
NoMethodError: undefined method `ins2' for Test:Class

我们正在通过不正确的类调用对象方法,因此抛出 NoMethodError

以上所有内容均使用 ruby​​ 2.0 执行。那我问什么呢?

  • 我做对了吗?
  • 我的 ruby​​ 术语是否正确?
  • 在设计得当的应用程序中是否真正使用了有意义的类实例变量?或者这些只是更好的@@class 变量?

最佳答案

it was very confusing for me to find out that @variable may mean 2 very different things.

不,它没有。类是对象,就像任何其他对象一样。它们可以像任何其他对象一样拥有实例变量。它们可以像任何其他对象一样拥有实例方法。事实上,与 Java 具有三种不同的“方法”(实例方法、静态方法和构造函数)不同,在 Ruby 中,只有一种方法:实例方法。

将类作为对象的美妙之处在于 @variable 总是意味着完全相同的东西

没有类实例变量这样的东西:它只是一个像其他任何实例变量一样的普通实例变量。该对象恰好是 Class 的一个实例,但这并没有改变实例变量的性质。 String 类对象的实例变量不是字符串实例变量,它只是一个实例变量。同样,Class 类对象的实例变量只是一个实例变量。

没有类方法这样的东西:它只是一个对象的普通单例方法,恰好是 Class 的一个实例。 (实际上,也没有单例方法这样的东西:它只是对象的单例类的普通实例方法。)

注意:Ruby 开发者可能会在随意的谈话中使用术语“类方法”。但这并不意味着类方法真的存在,只是说“类对象的单例类的实例方法”是一句空话。重要的是:因为类是对象,所以它们完全像所有其他对象一样工作。它们可以有实例方法(在类 Class 中定义或继承自 ModuleObjectKernel BasicObject),它们可以有“单例方法”(实际上是它们各自单例类的实例方法),它们可以有实例变量。

它们可以有类变量(@@variables)……这些很奇怪。忽略它们:-)

关于ruby:类实例变量与实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25025235/

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