#perl #methods #reference
#perl #методы #ссылка
Вопрос:
У меня есть объект perl, который содержит хэш хэшей coderefs (методов).
Следующий код работает для вызова метода:
my $c2 = $self->{Formatter}->{"ENOTE:Final"}($self, $e);
Мне кажется странным, что я должен называть это таким образом. Есть ли другой, лучший синтаксис для этого? Я не буду утомлять вас тем, что не будет работать.
Спасибо.
-E
Комментарии:
1. Является ли «ENOTE: Final» благословенной ссылкой?
2. Нет, это просто хэш-ключ с coderef в качестве значения. Кавычки там о чрезмерной осторожности из-за символа ‘:’. Это может работать без кавычек; я не пробовал.
3. Хорошо, так что, если это coderef. Тогда сама ссылка не будет передана в качестве первого аргумента, как это было бы, если бы это была благословенная ссылка. Какая часть синтаксиса странная?
4. Мне просто интересно, какой может быть нотация «наилучшей практики».
5. Я бы не назвал цепной вызов странным — за исключением непонимания того, что здесь за методы и зачем вам нужна такая цепочка. По этой причине я бы рекомендовал фактически разбить его для ясности, как в ответе mob.
Ответ №1:
Если вы ищете более объектно-ориентированный синтаксис, есть
my $method = $self->{Formatter}{"ENOTE:Final"};
my $c2 = $self->$method($e);
Комментарии:
1. Да, это тоже работает. Я надеялся уместить его в одной строке, что и привело меня к этому странному обозначению выше. Ваш ответ был таким, как выглядел исходный код.
2. @ErikBennett Причина, по которой это выглядит странно, заключается в том, что $ self — это и вызывающий элемент, который вы хотите использовать, и структура, содержащая ссылку на код. Поэтому вам нужно ссылаться на него в обоих этих контекстах.
3. Да, теперь я вижу это как источник моего вопроса. ответ @mob хорошо иллюстрирует это … после того, как он потратил время на изучение роли
$self->
в каждой из двух строк. Спасибо, ребята.