我在日常编程中使用Python,现在通过Ruby。
我可以在Python中做类似的事情,其中类的实例可以访问类中定义的变量,我也可以用我的类名调用变量。
>>> class Animal:
... name = "Python"
...
>>>
>>> a = Animal()
>>> a.name
'Python'
>>> Animal.name
'Python'
然而在Ruby中我得到错误,为什么会这样。
2.4.2 :033 > class Animal
2.4.2 :034?> leg = 4
2.4.2 :035?> @@hand = 2
2.4.2 :036?> @brain = 1
2.4.2 :037?> end
=> 1
2.4.2 :038 > a = Animal.new
=> #<Animal:0x0000000000e4d2e8>
2.4.2 :039 > a.leg
NoMethodError: undefined method `leg' for #<Animal:0x0000000000e4d2e8>
from (irb):39
from /home/cyborg/.rvm/rubies/ruby-2.4.2/bin/irb:11:in `<main>'
2.4.2 :040 > a.hand
NoMethodError: undefined method `hand' for #<Animal:0x0000000000e4d2e8>
from (irb):40
from /home/cyborg/.rvm/rubies/ruby-2.4.2/bin/irb:11:in `<main>'
2.4.2 :041 > a.brain
NoMethodError: undefined method `brain' for #<Animal:0x0000000000e4d2e8>
from (irb):41
from /home/cyborg/.rvm/rubies/ruby-2.4.2/bin/irb:11:in `<main>'
2.4.2 :047 > Animal.hand
NoMethodError: undefined method `hand' for Animal:Class
from (irb):47
from /home/cyborg/.rvm/rubies/ruby-2.4.2/bin/irb:11:in `<main>'
答案 0 :(得分:4)
在Python中,类的静态变量(实际上,所有属性)始终是公共的。哎呀,Python不区分公共和私有。隐私只是常规问题 [1] 。因此,您可以轻松访问name
中的Animal
。
但是,在Ruby中,类变量不能在类外部访问。默认情况下,它们是私有的 [2] 。一切都通过返回变量值的方法,并设置它们 [3] 。
所以,如果你想要访问类变量,你只需要为你的类 [4] 创建getter / setter方法。如下所示。
class Animal
@@hand = 2
def hand
@@hand
end
def hand=some_val
@@hand = some_val
end
end
irb> a = Animal.new
irb> a.hand
=> 2
irb> a.hand = 1
irb> a.hand
=> 1
例如变量,例如Daniel Roseman said,使用attr_accessor
。
答案 1 :(得分:2)
这与静态变量无关。
Ruby类中的所有属性都是私有的。如果你想从外面访问,你需要一个访问器方法 - 这就是错误谈论缺少方法的原因。
创建访问者的快捷方式是使用attr_accessor
方法。