Метод чтения, который возвращает значение переменной экземпляра, а затем сбрасывает его на ноль - PullRequest
2 голосов
/ 02 апреля 2010

Есть ли более короткий (и более чистый) способ написать следующий метод чтения:

class Foo
  attr_writer :bar

  def bar
    return_value = @bar
    self.bar = nil
    return_value
  end
end

Вот несколько выводов на консоли, чтобы показать, что она делает:

>> foo = Foo.new
=> #<Foo:0x1010e9cf8>
>> foo.bar
=> nil
>> foo.bar = "ok"
=> "ok"
>> foo.bar
=> "ok"
>> foo.bar
=> nil

Ответы [ 4 ]

3 голосов
/ 02 апреля 2010
  def bar
    @bar
  ensure
    @bar = nil
  end

Это может быть однострочник, если вы хотите:

  def bar
    @bar ensure @bar = nil
  end
1 голос
/ 02 апреля 2010
 def bar
   @bar, rv = nil, @bar
   rv
 end

или

 def bar
   (@bar, rv = nil, @bar)[1]
 end
0 голосов
/ 02 апреля 2010

Менее умно, но, возможно, более ясно:

class Foo

  def initialize
    @bar = []
  end

  def bar
    @bar.pop
  end

  def bar= (obj)
    @bar[0] = obj
  end

end
0 голосов
/ 02 апреля 2010

Не думай так. Выглядит довольно коротко и чисто уже для меня!

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