我读过" Ruby实例变量什么时候设置? "但我在使用类实例变量时有两种想法.
类变量由类的所有对象共享,实例变量属于一个对象.如果我们有类变量,那么使用类实例变量的余地就不大了.
有人可以解释这两者之间的区别以及何时使用它们?
这是一个代码示例:
class S
@@k = 23
@s = 15
def self.s
@s
end
def self.k
@@k
end
end
p S.s #15
p S.k #23
Run Code Online (Sandbox Code Playgroud)
我现在明白了,Class Instance Variables不会传递给继承链!
ruby instance-variables class-variables class-instance-variables
谁能告诉我类变量和类实例变量之间的区别?
如果我有一个带有a的类attr_accessor,则默认创建一个实例变量以及相应的getter和setter.但是,有没有办法让它来创建一个类变量或类实例变量而不是创建一个实例变量?
ruby instance-variables class-variables class-instance-variables
我知道有人说@@class_var在Ruby中应该避免使用类变量(例如),而应该@instance_var在类范围中使用实例变量(例如):
def MyClass
@@foo = 'bar' # Should not do this.
@foo = 'bar' # Should do this.
end
Run Code Online (Sandbox Code Playgroud)
为什么在Ruby中使用类变量不受欢迎?
class << self
attr_accessor :n, :totalX, :totalY
end
Run Code Online (Sandbox Code Playgroud)
上面的语法用于定义类实例变量.但是当我考虑语法含义时,它对我没有任何意义,所以我想知道这种类型的语法是否用于任何其他类型的定义.我在这里的困惑是:
class << self
Run Code Online (Sandbox Code Playgroud)
追加运算符通常意味着"向左侧的对象添加右侧的内容".但是在这个块的上下文中,如何将"将此块的内容放入类实例的定义而不是实例"?
出于同样的原因,我很困惑为什么在一个上下文类中,<< self可以定义类实例变量,而在另一个上下文它似乎创建了类变量,例如:
class Point
# Instance methods go here
class << self
# Class methods go here
end
end
Run Code Online (Sandbox Code Playgroud) ruby class-method class-variables class-instance-variables instance-methods
根据Reek的说法,创建一个类变量被认为是"代码味道".这背后的解释是什么?
在模块a.py中
def task():
print "task called"
a = task
class A:
func = task # this show error unbound method
#func = task.__call__ # if i replace with this work
def __init__(self):
self.func_1 = task
def test_1(self):
self.func_1()
@classmethod
def test(cls):
cls.func()
a()
A().test_1()
A.test()
Run Code Online (Sandbox Code Playgroud)
输出:
task called
task called
Traceback (most recent call last):
File "a.py", line 26, in <module>
A.test()
File "a.py", line 21, in test
cls.func()
TypeError: unbound method task() must be called with A instance …Run Code Online (Sandbox Code Playgroud) python class class-variables class-instance-variables python-2.7
如果我有以下Ruby代码:
class Blah
def self.bleh
@blih = "Hello"
@@bloh = "World"
end
end
Run Code Online (Sandbox Code Playgroud)
@blih和@@ bloh究竟是什么?@blih是Blah类中的实例变量,而@@ bloh是Blah类中的类变量,对吗?这是否意味着@@ bloh是Blah班级中的一个变量,Class?
我有一个Python类,其class属性设置为除了None.创建新实例时,对该属性所做的更改将在所有实例中持续存在.
这里有一些代码可以理解这一点:
class Foo(object):
a = []
b = 2
foo = Foo()
foo.a.append('item')
foo.b = 5
Run Code Online (Sandbox Code Playgroud)
正如人们所期望的那样使用foo.a回报['item']和foo.b回报5.
当我创建一个新的实例(我们叫它bar),使用bar.a收益['item']和bar.b回报5,太!但是,当我最初设置所有类属性None然后将它们设置为任何内容时__init__,如下所示:
class Foo(object):
a = None
b = None
def __init__(self):
self.a = []
self.b = 2
Run Code Online (Sandbox Code Playgroud)
在bar.a返回[]和bar.b返回2时使用foo.a返回['item']和foo.b返回5.
这是假设工作的方式吗?在我编写Python的3年里,我显然从未遇到过这个问题,并希望得到一些澄清.我也无法在文档中的任何地方找到它,所以如果可能的话,给我一个很好的参考.:)
我试图在定义这些对象的类中保持给定类的对象实例的计数.
首先我知道代码反射和ObjectSpace.each_object,但我不想使用反射,让类本身能够"照顾"自己.
我环顾四周,我发现的所有解决方案似乎都在类定义中使用了@@ class_variables,例如,这个问题的接受答案:如何在Ruby中获取类实例?
虽然我一直在阅读,但我发现ruby中的类变量在某些情况下表现得非常糟糕......最大的原因是:
在程序顶层定义的类变量由所有类继承.它的行为类似于全局变量.
来源及更多信息:http://ruby.runpaint.org/variables#class
所以,我尝试使用类实例变量而不是类变量来编写一个存储其实例化对象数量的类,显然它似乎工作正常但是因为我仍然在学习这种"深入的"语言主题我想问你我写的代码是否正确和/或有意义:
class Pizza
@orders = 0
def self.new
@orders += 1
end
def self.total_orders
@orders
end
end
new_pizza = Pizza.new #=> 1
special_pizza = Pizza.new #=> 2
fav_pizza = Pizza.new #=> 3
Run Code Online (Sandbox Code Playgroud)
我的一个疑问是,重写Pizza.new方法我"删除"原始.new方法的一些重要功能?(原始的.new方法提供了什么?我如何使用反射"检查"方法代码?)我还做错了什么,或者我的方法完全错误,为什么?
谢谢
编辑:忘了添加这个重要的一点:
作为一种更好地约束事物范围的方法,我希望Pizza类能够只计算对象实例化时间,而不是在其@instance类变量上有一个setter方法,可以在代码中随时访问它(Pizza.count = 1000).这就是我试图覆盖"新"的原因.
我认为这是最棘手的部分让我问自己我的方法是在正确的方向,或者我是否应该停止对这些语言机制的反应如此之多,而是添加一些逻辑来让计数只在一个对象发生时发生一个Pizza类进入了ObjectSpace ..
我只是在寻找更优雅,更臃肿的方式来获得这种语言功能..
无论哪种情况,帮助将不胜感激..
再次感谢.
ruby counter instances class-variables class-instance-variables