статическая переменная доступа ruby - PullRequest
1 голос
/ 15 августа 2011
class A
  @@ololo = 1
end

A::ololo
A.new.ololo
NoMethodError: undefined method `ololo'

исправный. Мне нужен attr_reader

class B
  @@ololo = 1
  attr_reader :ololo
end

A::ololo
NoMethodError: undefined method `ololo'
A.new.ololo
=> nil

WTF? есть ли ограничения для ruby-аксессоров?

class C
  @@ololo = 1
  def self.ololo
    @@ololo
  end
  def ololo
    @@ololo
  end
end

C::ololo
=> 1
C.new.ololo
=> 1

Рубиновые мужчины обычно говорят: «Да! Довольно хорошо!». это довольно хорошо? Кто-нибудь может предоставить более короткий код?

Ответы [ 3 ]

15 голосов
/ 15 августа 2011

Вы не можете делать то, что хотите:)

@ Харальд прав.attr_reader определит GETTER только для переменной экземпляра, для «статического» (он же «переменные класса») вам нужно определить сеттер и геттер самостоятельно:

class A
  @@ololo = 1

  # instance level

  # getter
  def ololo
    @@ololo
  end
  # setter
  def ololo=trololo
    @@ololo = trololo
  end

  # and class level
  # if you need it

  # getter
  def self.ololo
    @@ololo
  end
  # setter
  def self.ololo=trololo
    @@ololo = trololo
  end
end

Итак:

a = A.new
b = A.new
A.ololo
#=> 1
a.ololo
#=> 1
A.ololo = 100
A.ololo
#=> 100
a.ololo
#=> 100
b.ololo
#=> 100
a.ololo = 4
A.ololo
#=> 4

...

Короче:

class A
  @ololo = 1
  class << self
    attr_accessor :ololo
  end
end
3 голосов
/ 15 августа 2011

attr_accessor :ololo определяет методы ololo и ololo=, которые работают с переменной экземпляра с именем @ololo.Итак, что произойдет, когда вы попытаетесь получить доступ к A::ololo, ruby ​​найдет ваш экземплярный метод ololo и потерпит неудачу, поскольку вы пытаетесь вызвать его как метод класса.

2 голосов
/ 04 декабря 2014

Да, вы можете.

class A
  cattr_accessor :ololo    
  @@ololo = 1
end

class B
  A.ololo #Gets class variable "ololo" from class A
end

Это в основном функция Ruby on Rails.Однако за пределами Rails вы можете получить функциональность из гема Ruby Facets:

https://github.com/rubyworks/facets/blob/master/lib/core-uncommon/facets/module/cattr.rb

См. Это обсуждение: cattr_accessor за пределами рельсов

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