Если Вы хотите удостовериться, что каждый член массива явно инициализируется, просто опустите размер от объявления:
int myArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
компилятор выведет размер из списка инициализатора. К сожалению, для многомерных массивов только наиболее удаленный размер может быть опущен:
int myPoints[][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };
в порядке, но
int myPoints[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };
не.
Не совсем. Каждый вызов действия контроллера не имеет состояния. После завершения действия контроллера ничего не доступно. Новый экземпляр контроллера создается для каждого запроса, а затем отбрасывается в конце запроса.
Если вы не хотите сохранять его в сеансе или модели базы данных, у вас не так много вариантов, если вы ' мы хотим, чтобы эта переменная была специфичной для конкретного сеанса.
Если она является глобальной для всех сеансов, вы можете поместить ее в @@ class_variable
, а не в @instance_variable
, но это может стать беспорядочным, если вы начнете использовать несколько процессов Rails (каждый из которых будет иметь свою собственную копию), или если вы работаете в потокобезопасном режиме, вы можете столкнуться с неприятными ошибками параллелизма.
Думаю, вы могли бы посмотрите на что-то вроде memcached, но вы
Не волнуйтесь, сеансы не кусаются.
Кроме того, сеанс, вероятно, лучший способ сделать это.
Вы могли бы сделать использование встроенного механизма Rails.cache для хранения значения, но, как упоминалось в первом ответе, вам придется отключить что-то вроде user_id. Это хороший способ, поскольку вы можете поддерживать его с помощью различных механизмов хранения.
Rails.cache.write(:foo)
# in later action
Rails.cache.read(:foo)
Еще одна вещь, на которую вы могли бы обратить внимание, - это хэш флэш-памяти, который предоставляет метод сохранения, позволяющий сохранить значение флэш-памяти более одного последующего запроса.
Итак, в действии 1 вы можете создать значение:
flash[:foo] = some_value
flash.keep(:foo)
В действии 2 вы можете получить к нему доступ и снова вызвать keep, если хотите, чтобы он оставался в живых для других последующих действий.
flash[:foo] #use it for something
flash.keep(:foo) # keep it for another request
Это немного сложная вещь для делать чисто в контексте HTTP-запросов.
Мне тоже интересно, почему вы против использования сеанса? Если вам не нравится работать с сеансом непосредственно в ваших действиях, вы можете эмулировать сохранившуюся переменную экземпляра @foo
с помощью фильтров. Может, что-то вроде этого?
class FooController < ApplicationController
before_filter :load_foo
after_filter :save_foo
private
def load_foo
@foo = session[:foo] || 0
end
def save_foo
session[:foo] = @foo
end
end
Ваши действия смогут управлять значением с помощью переменной экземпляра @count
, и это будет автоматически сохранено в сеансе.
Если это простой счетчик или строка, я думаю, что лучшим решением будет сохранить их в сеансе. Таким образом, он будет там, если вы используете несколько веб-серверов.
Почему вы против использования сеанса для этого?