Доступ к концепции переменных: Ruby Vs Python - PullRequest
0 голосов
/ 12 мая 2018

Я использую 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 голосов
/ 12 мая 2018

В Python статические переменные (фактически, все атрибуты) класса всегда общедоступны. Черт, Python не различает публичное и приватное. Конфиденциальность - это просто вопрос конвенции [1] . Таким образом, вы можете легко получить доступ к name в Animal.

Однако в Ruby переменные класса не доступны вне класса. По умолчанию они закрыты [2] . Все проходит через методы, которые возвращают значения переменных и устанавливают их также [3] .

Итак, если вы хотите получить доступ к переменным класса, вам просто нужно создать методы получения / установки для вашего класса [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 

Для переменных экземпляра, например, как сказал Даниэль Роузман , используйте attr_accessor.


Ссылки

0 голосов
/ 12 мая 2018

Это не имеет ничего общего со статическими переменными.

Все атрибуты в классах Ruby являются закрытыми. Если вы хотите получить доступ извне, вам нужен метод доступа - вот почему ошибки говорят о недостающих методах.

Ярлык для создания средства доступа - использовать метод attr_accessor.

...