Почему обратные вызовы ActiveRecord требуют, чтобы переменные экземпляра или методы экземпляра были снабжены префиксом сам ключевое слово?

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

общий подход А к этому виду проблемы должен записать код, который обрабатывает данные на шаге 3 к использованию начать/конечным итератор пара; тогда это может легко обработать любого станд.:: строка, вектор символов, пара необработанных указателей, и т.д. В отличие от передачи его контейнерный тип как станд.:: строка, это больше не знало бы или заботилось бы, как память была выделена, так как это будет все еще принадлежать вызывающей стороне. Перенос этой идеи ее логическому выводу повышение:: диапазон , который добавляет всех перегруженных конструкторов для тихого разрешения вызывающей стороне просто передать string/vector/list/any вид контейнера с .begin () и .end (), или отдельные итераторы.

записавший Ваш код обработки для работы над произвольным диапазоном итератора Вы могли тогда даже записать пользовательский итератор (не настолько трудно, как это звучит, в основном просто объект с некоторыми стандартными определениями типов и оператор ++ /* / = / ==/! = перегруженный для получения вперед только итератор), который заботится об усовершенствовании к следующему фрагменту каждый раз, когда это поразило конец того, это продолжает работать, перескакивая через пробел (я предполагаю, что это - то, что Вы подразумевали под обрезкой). То, что Вы никогда не должны были собирать целую строку непрерывно вообще. Было ли это победой, зависит от того, сколько фрагментов/как, больших из фрагментов, Вы имеете. Это по существу, какова веревка SGI, упомянутая Martin York: строка, где добавляют, формирует связанный список фрагментов вместо непрерывного буфера, который таким образом подходит для намного более длинных значений.

ОБНОВЛЕНИЕ (так как я все еще вижу случайный upvotes на этом ответе):

C++ 17 представляет другой выбор: станд.:: string_view, который заменил станд.:: строка во многих функциональных подписях, ссылка невладения на символьные данные. Это неявно конвертируемо от станд.:: строка, но может также быть явно создан из непрерывных данных, принадлежавших где-то в другом месте, избежав ненужного станд. копирования:: строка налагает.

18
задан John Topley 30 September 2009 в 09:30
поделиться

2 ответа

Технически вам нужно только использовать self перед методами присваивания. Это необходимо, чтобы различать метод экземпляра с завершающим знаком = и присвоение локальной переменной.

15
ответ дан 30 November 2019 в 09:06
поделиться

Насморн прав.

ActiveRecord :: Base поместил все имена столбцов в переменную экземпляра @attributes (хэш) и создал методы экземпляра средств доступа для этих имен столбцов.

Например:

card_status - это столбец в таблице external_printing_cards, он будет иметь методы доступа с именем card_status и card_status =

Поскольку определение локальной переменной ruby ​​является динамическим, Строка

def after_find
  ....  
  card_status = false if self.is_used_up?
  ....
end

будет означать, что мы определяем и назначаем локальную переменную card_status , а не метод экземпляра card_status =

В статье, опубликованной Peer Allan, содержится более подробное объяснение по этому поводу.

3
ответ дан 30 November 2019 в 09:06
поделиться
Другие вопросы по тегам:

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