ruby:类实例变量与实例变量
我的想法是为那些来自ruby:类实例变量与实例变量,ruby,instance-variables,class-instance-variables,Ruby,Instance Variables,Class Instance Variables,我的想法是为那些来自java背景的人创建一个社区wiki,因为阅读了大量的解释,我无法理解任何东西,直到我真正尝试了一些东西,拼图的各个部分开始找到它们的位置。但我首先要确保我做对了。来自这样的背景,我很困惑地发现@variable可能意味着两种截然不同的东西。 以下是一个例子: class Test @ins = "gah" def self.ins puts @ins end def initialize() @ins = "wtf?" end de
java
背景的人创建一个社区wiki,因为阅读了大量的解释,我无法理解任何东西,直到我真正尝试了一些东西,拼图的各个部分开始找到它们的位置。但我首先要确保我做对了。来自这样的背景,我很困惑地发现@variable
可能意味着两种截然不同的东西。
以下是一个例子:
class Test
@ins = "gah"
def self.ins
puts @ins
end
def initialize()
@ins = "wtf?"
end
def ins2
puts @ins
end
end
据我所知,第一个@ins
是表示类Test
的对象的实例变量。第二个@ins
是类Test
的对象中的实例变量
现在事情开始对我有意义了。这里有几个例子:
[14] pry(main)> test.ins2
wtf?
我们调用一个对象的方法,它返回对象的实例变量
[15] pry(main)> test.ins
NoMethodError: undefined method `ins' for #<Test:0x000000017d9348 @ins="wtf?">
我们正在调用一个类方法,以便它正确地看到类对象的实例变量
[17] pry(main)> Test.ins2
NoMethodError: undefined method `ins2' for Test:Class
我们通过不正确的类调用对象方法,因此抛出nomethoderor
所有这些都是用ruby 2.0执行的。那我要问什么
- 我说得对吗
- 我的ruby术语正确吗
- 在正确设计的应用程序中,类实例变量的实际使用是否有意义?或者这些只是更好的@类变量
@variable
可能意味着两种截然不同的东西,我感到非常困惑
class Test
# class scope, uncomment following line to see the value of self
# p self
@ins = "gah"
def self.ins
# class scope
# p self
puts @ins
end
def initialize()
# object scope
# p self
@ins = "wtf?"
end
def ins2
# object scope
# p self
puts @ins
end
end
不,没有。类是与任何其他对象一样的对象。它们可以像任何其他对象一样拥有实例变量。它们可以像任何其他对象一样拥有实例方法。事实上,与Java不同,Java有三种不同的“方法”(实例方法、静态方法和构造函数),在Ruby中,只有一种方法:实例方法
将类作为对象的美妙之处在于@variable
总是意味着完全相同的事情
没有类实例变量:它只是一个普通的实例变量。该对象恰好是类
的实例,但这不会改变实例变量的性质。类String
的对象的实例变量不是字符串实例变量,它只是一个实例变量。类似地,类class
的对象的实例变量只是一个实例变量
[15] pry(main)> test.ins
NoMethodError: undefined method `ins' for #<Test:0x000000017d9348 @ins="wtf?">
没有类方法:它只是一个对象的普通单例方法,恰好是class
的实例。(实际上,也没有单例方法:它只是对象单例类的普通实例方法。)
注:红宝石爱好者可以在随意的交谈中使用术语“类方法”。但这并不意味着类方法实际上是存在的,它只意味着“类对象的单例类的实例方法”是满口的。重要的是:因为类是对象,所以它们的工作方式与所有其他对象完全相同。它们可以有实例方法(在类class
中定义或继承自Module
、Object
、Kernel
或BasicObject
),它们可以有“单例方法”(实际上是各自单例类的实例方法),它们可以有实例变量
它们也可以有类变量(
@@variables
)…这些都很奇怪。忽略它们:-)我觉得一切都很好
类变量将通过继承传递,而类上的实例变量则不会。(src:)
就设计而言,我倾向于完全避免类变量(我宁愿使用单例),但如果必须选择一个,我可能会选择类变量而不是类实例变量,以避免混淆
对象继承的(读取文档)实例。这就是为什么类是对象
self
中定义每个实例变量(标有@
的ID,如@ins
)
当self
是类时,它们是类的实例变量(类实例变量)。
当self
是对象时,它们是对象的实例变量(实例变量)self
表示不同的事物
class Test
# class scope, uncomment following line to see the value of self
# p self
@ins = "gah"
def self.ins
# class scope
# p self
puts @ins
end
def initialize()
# object scope
# p self
@ins = "wtf?"
end
def ins2
# object scope
# p self
puts @ins
end
end
wt*?:我写了一篇有趣的文章+1您可以将其称为类方法,但从技术上讲,它不是。这是singleton类的一种方法观看这个@SamD,谢谢你的视频,我一定会看的。但我不明白为什么我要称之为“单身阶级”。这意味着还有其他类型的类。将其称为类对象的方法不是更好吗?因此,它将是“类对象”与“类实例”,前者是表示类的对象,后者是该类的对象?Singleton类是一个匿名类,在定义self.method时隐藏在后台。匿名类(Singleton)将被初始化并将方法添加到其中。之后的任何self.method都将添加到singleton@SamD对不起,我不能理解。也许这是我稍后会看的视频。但是当一切都是对象时,
类是什么呢?在任何情况下,它都会成为一个话题。我想问的是,当所有的类都像你上面描述的那样时,为什么称它为“单例类”而不是“类”。很抱歉,在这个逻辑中,我们可以说没有什么不同,因为所有的东西实际上都是位:)在典型的OO设计中,一个实例变量和一个类实例变量(我想我们在定义上是一致的)对于程序来说,语义上是不同的。我们需要一些术语