Объем Ruby ДАННЫХ после __ ЗАКАНЧИВАЕТСЯ __

Атомарный:

Атомарные гарантии, что доступ к свойству будет выполнен атомарным способом. Например, это всегда возвращает полностью инициализированные объекты, любой получает/устанавливает свойства на одном потоке, должен завершиться, прежде чем другой может получить доступ к нему.

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

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

Профессионалы: Возврат полностью инициализированных объектов каждый раз делает его лучше всего выбором в случае многопоточности.

Недостатки: хит Производительности, делает выполнение немного медленнее

Неатомарным:

В отличие от Атомарного, это не гарантирует, чтобы полностью инициализированный объект возвратился каждый раз.

Профессионалы: Чрезвычайно быстрое выполнение.

Недостатки: Возможности мусора оценивают в случае многопоточности.

16
задан avdgaag 26 August 2009 в 10:38
поделиться

2 ответа

ДАННЫЕ такие же. Вы получите тот же результат, если вместо выполнения Foo.new выполните DATA.read второй раз.

Это потому, что после первого чтения DATA (который является вводом-выводом) достиг конца потока, поэтому любое дальнейшее чтение будет возвращать пустую строку, если вы не добавите дополнительные данные в DATA или не перемотаете DATA в начало потока.

Изменить: для возврата к точке сразу после __ END __ вы должны прочитать DATA.pos перед выполнением любого чтения DATA , а затем восстановить pos до этого значения после чтения. Самое простое решение, вероятно, просто выполнить FOO = DATA.read в начале сценария, а затем использовать FOO .

22
ответ дан 30 November 2019 в 22:31
поделиться

сначала перемотайте ДАННЫЕ, потому что это поток.

class Foo
  def initialize()
    DATA.rewind
    puts DATA.read.inspect
  end
end
puts DATA.read.inspect
Foo.new
__END__
test
-4
ответ дан 30 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: