Косвенный вызов методов.
name $sword $oldname || "Glamdring"; # здесь нельзя использовать "or" !
становиться желаемым:
$word->name($oldname || "Glamdring");
но:
speak $mage "friend" && enter(); # здесь должно быть "and" !
становится двухсмысленным:
$mage->speak("friend" && enter());
что можно исправить, переписав в одной из следующих эквивалентных форм:
enter() if $mage->speak("friend");
$mage->speak("friend") && enter();
speak $mage "friend" and enter();
--------------
Мне не ясно почему нельзя использовать вместо || - "or", а вместо "and" - && . Ведь они отличаются только приоритетом над запятой, а тут никаких запятых нет.
И еще:
Почему становится двухсмысленным:
$mage->speak("friend" && enter());
и вместо него лучше использовать
$mage->speak("friend") && enter();
ведь в этом случае метод speak примет в качестве аргумента ("friend") и если результат выражения будет истинным, то как мне кажется анализатор просто перейдет к следующему enter() без вызова его в качестве аргумента метода. Я понимаю, что при косвенном вызове метода скобки с аргументов можно снять, но если они проставлены в ("friend"), то по идее должно вычисляться только то то, что находится в скобках? Или я не прав.
Я просто хочу понять логику, что бы в дальнейшем правильно использовать синтаксис вызова методов.
Спасибо за внимание.
Простота - залог здоровья.