Как создать константы только один раз - PullRequest
2 голосов
/ 05 июля 2019

Тривиально написать макрос для преобразования bytes"hello" в

"hello".getBytes или Array('h'.getByte, 'o'.getByte, 'l'.getByte, 'l'.getByte, 'o'.getByte)

Проблема здесь в том, что мы не получаем постоянный литерал, т.е. "hello" eq "hello" не выполняется для значений, построенных макросами: bytes"hello" ne bytes"hello". Существует также недостаток производительности, так как байтовый массив создается много раз.

То, что на самом деле bytes"hello" должно быть преобразовано, является объектом глобальной области видимости:

object `bytes"hello"` {
  val value = Array('h'.getByte, 'o'.getByte, 'l'.getByte, 'l'.getByte, 'o'.getByte)
}

Но похоже, что Scala Macros в своем текущем состоянии не позволяет создавать глобальные объекты. Я не прав, и это возможно в текущей версии Scala?

...