Доступ к переменной экземпляра класса извне - PullRequest
5 голосов
/ 17 ноября 2010

Я понимаю (я думаю) разницу между переменными класса и переменными экземпляра класса в Ruby.

Мне интересно, как можно получить доступ к переменным экземпляра класса из-за пределов этого класса.

Изнутри (то есть в методе класса, а не в методе экземпляра), к нему можно получить доступ напрямую, но снаружи есть способ сделать MyClass.class.[@$#]variablename?

У меня нет конкретной причины для этого, просто изучаю Ruby и задаюсь вопросом, возможно ли это.

Ответы [ 3 ]

6 голосов
/ 30 марта 2012
class MyClass

    @my_class_instance_var = "foo"

    class << self
        attr_accessor :my_class_instance_var
    end

end

puts MyClass::my_class_instance_var

Вышеуказанные выходы:

>> foo

Я считаю, что Арку продемонстрировал, как получить доступ к переменным класса (@@), а не к классу экземпляру переменным (@) извнекласс.

Из этого эссе я извлек вышеизложенное: Четкое видение метаклассов

3 голосов
/ 23 октября 2015

В Ruby есть класс, объект класса и экземпляр.

Переменная класса принадлежит классу.
Переменная экземпляра класса принадлежит объекту класса

Переменная класса:

Доступен внутри класса и его экземпляров.
attr_accessor не работает с переменными класса.

Переменная экземпляра класса:

Доступно только через класс.
attr_accessor работает, если вы определяете его в классе, а не в объекте класса, как показано ниже.

class A
    @b = 1
    class << self
        attr_accessor :b
    end
end

Определение метода получения и установки для экземпляров для переменной экземпляра класса b в:

class A
    @b = 1
    class << self
        attr_accessor :b
    end
    def b
        A.b
    end
    def b=(value)
        A.b=value
    end
end

Теперь к переменной экземпляра класса b можно получить доступ через класс-владелец и его экземпляры.
Как многолетний ученик по рубину, это самое лучшее, что я могу сделать.

`irb(main):021:0* class A
irb(main):022:1> @b = 1
irb(main):023:1> class << self
irb(main):024:2> attr_accessor :b
irb(main):025:2> end
irb(main):026:1> def b
irb(main):027:2> A.b
irb(main):028:2> end
irb(main):029:1> def b=(v)
irb(main):030:2> A.b=v
irb(main):031:2> end
irb(main):032:1> end
=> :b=
irb(main):033:0> A.b
=> 1
irb(main):034:0> c = A.new
=> #<A:0x00000003054440>
irb(main):035:0> c.b
=> 1
irb(main):036:0> c.b= 50
=> 50
irb(main):037:0> A.b
=> 50
irb(main):038:0>`

Да, я начинаю не любить рубин ... это лучшее решение.

1 голос
/ 06 февраля 2017

В ruby ​​вы можете достичь этого двумя способами

  1. определение вручную геттера и сеттера
  2. с использованием методов attr_ *

Позвольте мне описать вышеперечисленные способы для вас,

Определение геттера и сеттера вручную

class Human
  def sex=(gender)
    @sex = gender
  end

  def sex
    @sex
  end
end

//from outside  class 
human = Human.new
// getter method call 
puts human.sex
// setter method call to explicitly set the instance variable 
human.sex = 'female'

puts human.sex 
// now this prints female which is set

с использованием методов attr_ *

class Human
  attr_accessor :sex
end

//from outside 

human = Human.new
// getter method call 
puts human.sex
// setter method call to explicitly set the instance variable 
human.sex = 'female'

puts human.sex 
// now this prints female which is set 

attr_accessor внутренне создает для вас методы setter и getter, если вам нужен только setter, вы можете просто использовать attr_writer, а если вам нужен только getter, вы можете использовать attr_reader

Надеюсь, я ответил на ваш вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...