Другой хэш функций ref внутри модуля Perl

#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-> в каждой из двух строк. Спасибо, ребята.