Почему я не могу использовать переменную экземпляра класса внутри одноэлементного определения класса?
Я пытаюсь установить переменную экземпляра внутри одноэлементного класса, и я не могу заставить его работать.
Вот упрощенная версия проблемы:
class MyClass
class << self
attr :my_attr
@my_attr = {}
def my_method (x, y)
(@my_attr[x] ||= []) << y
end
end
end
MyClass.my_method(1, 2)
# => NoMethodError: undefined method `[]' for nil:NilClass
Вот оригинальный пример кода:
class Mic
class Req < Rack::Request; end
class Res < Rack::Response; end
class << self
attr :routes
@routes = {}
def call(env)
dup.call!(env)
end
def call!(env)
(@app||=new).call(env)
end
def get(path, opts={}, &blk)
puts @routes.inspect # nil
route 'GET', path, opts, &blk
end
def route(type, path, opts, &blk)
(@routes[type]||=[]) << {type: type, path: path, opts: opts, blk: blk}
end
end
def call(env)
@env = env
@req = Req.new(env)
@res = Res.new
@res.finish
end
end
1 ответ
Решение
Итак, сокращенный код, но вам, вероятно, нужно избегать как можно большего доступа к переменной экземпляра.
class Mic
class << self
def routes
@routes ||= {}
end
def method_which_acccess_routes
routes[:this] = :that
end
end
def instance_method_access_routes
Mic.routes[:the_other] = :nope
end
end
Вы можете изменить маршруты таким образом без доступа, но если вам нужно полностью перезаписать его, вам понадобится attr_writer
метод для routes
также.