访问变量概念:Ruby Vs Python

时间:2018-05-12 14:24:06

标签: python ruby python-3.x python-2.7

我在日常编程中使用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>'

2 个答案:

答案 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方法。