【问题标题】:Accessing variable concept: Ruby Vs Python访问变量概念:Ruby Vs Python
【发布时间】:2018-10-22 18:03:33
【问题描述】:

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

【问题讨论】:

  • leg 是一个无法从外部访问的局部变量。试试puts a.handputs a.brain
  • @Attersson 同样的错误
  • ruby 不允许您像 python 那样从外部访问类和实例变量。您需要使用显式的 setter 和 getter。见解释herehere
  • @bunji 谢谢,得到澄清

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


【解决方案1】:

在 Python 中,类的静态变量(实际上是所有属性)始终是公共的。哎呀,Python不区分公共和私有。隐私只是惯例[1]。因此,您可以在Animal 中轻松访问name

但是,在 Ruby 中,类变量不能在类外访问。默认情况下它们是私有的[2]。一切都通过返回变量值并设置它们的方法[3]

因此,如果您想访问类变量,您只需为您的类创建 getter/setter 方法[4]。就像下面的一样。

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


参考文献

【讨论】:

  • 谢谢@Sean Francis
【解决方案2】:

这与静态变量无关。

Ruby 类中的所有属性都是私有的。如果您想从外部访问,则需要一个访问器方法 - 这就是错误谈论缺少方法的原因。

创建访问器的捷径是使用attr_accessor 方法。

【讨论】:

  • 感谢您的澄清
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
相关资源
最近更新 更多