Nano Hash - криптовалюты, майнинг, программирование

Lua переопределяет # для строк

Я пытаюсь реализовать свой собственный метод длины для строк в Lua. Я успешно переопределил метод len() для строки, но понятия не имею, как это сделать для оператора #.

orig_len = string.len
function my_len(s)
  print(s)
  return orig_len(s)
end

string.len = my_len
abc = 'abc'

Если я позвоню:

print(abc:len())

Он выводит:

abc
3

Но

print(#abc)

Выводит только «3», а это значит, что она вызвала исходную функцию длины вместо моей. Есть ли способ заставить # вызывать мою функцию длины?


Ответы:


1

Я пытаюсь реализовать свой собственный метод длины для строк в Lua.

Вы не можете сделать это из Lua.

Вам нужно будет изменить исходный код Lua, в частности виртуальную машину (lvm.c), и изменить ее обработку кода операции OP_LEN. В Lua 5.2 вам нужно изменить luaV_objlen, чтобы проверить метаметод, прежде чем получить фактическую длину строки:

case LUA_TSTRING: {
  tm = luaT_gettmbyobj(L, rb, TM_LEN);        // <--- add this line
  if (!ttisnil(tm))                           // <--- add this line
      break;                                  // <--- add this line
  setnvalue(ra, cast_num(tsvalue(rb)->len));
  return;
}

Но это похоже на злоупотребление перегрузкой оператора, например, перегрузку + для обозначения деления или чего-то в этом роде.

15.04.2014
  • Злоупотребление правильно. Строки Lua представляют собой строки байтов, а не строки символов. Конечно, есть функции, которые интерпретируют их как символы с учетом локали, но длина строки никогда не должна рассматриваться как что-то иное, кроме количества байтов. 16.04.2014
  • Ну, мне нужно заставить Lua обрабатывать строки utf-8, как родной. Я могу сделать для этого свои функции, например strlen или strsub, но я хочу, чтобы обработка utf-8 была прозрачной для программиста, поэтому мне нужны строковые функции Lua для работы с utf-8. 16.04.2014
  • Я считаю, что это особенность Lua 5.3. 16.04.2014

  • 2

    Вы не можете переопределить оператор # для строк в Lua, даже с метатаблицами: метаметод __len не применяется к строкам.

    На самом деле в Lua не существует понятия переопределения каких-либо операторов. Метаметоды Lua — это отказы: они используются, когда Lua не может работать самостоятельно. Таким образом, арифметические метаметоды не применяются к числам, а метаметод длины не применяется к строкам.

    С таблицами ситуация иная, потому что они предназначены для реализации объектов в Lua.

    15.04.2014
  • Значит, нет возможности сделать то, что мне нужно? 15.04.2014
  • @Xanx, нет, если только вы не хотите оборачивать строки таблицами. 15.04.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..