Я думаю, я понял это. Роберт П. был прав, но он получил только половину ответа: Readonly
и readonly
делают разные вещи, хотя они должны делать то же самое, факт, что они этого не делают, является ошибкой. Я постараюсь объяснить, что происходит.
Readonly
имеет две реализации для скаляров: одна ( Readonly :: XS ), основанная на флаге SvREADONLY
, и одна (Readonly :: Scalar), основанная на связях, эмулирующих * 1009. * флаг.
readonly
также имеет две реализации: одну в Perl (которая выполняет самоназначение и проверяет, вызывает ли она исключение) и одну в XS (опять же на основе флага SvREADONLY
).
Существует 4 возможных комбинации, и, к сожалению, наиболее распространенная (только perl Readonly и XS readonly) является единственной, которая не работает так, как рекламируется.
Вот суть: sub Readonly::Readonly
на самом деле вообще не использует Readonly::XS
, только sub Readonly::Scalar
. Это, вероятно, ошибка . readonly
правильно сообщает, что переменная не является переменной только для чтения: ее только для чтения имитирует связь.
Это Readonly
, здесь вина, ИМО, она должна делать правильные вещи, когда может, и документировать, когда не может. Прямо сейчас это не делает ни одного из тех.