Краткое выражение foreach в одной строке

У вас должен быть параметризованный конструктор для вашего класса Access, который принимает объект Movie.

6
задан brian d foy 20 February 2009 в 19:45
поделиться

7 ответов

Только, чтобы быть Perlish (TMTOWTDI) можно использовать логическое замыкание накоротко:

-f or die "Not a file: $_" foreach @files;

Протестированный на OS X и работах.

Как примечание стороны, -f or die похож на большое количество общих open() or die конструкции, которые я вижу в Perl, и все еще (я думаю) показывают намерение строки (к die при определенных условиях).

13
ответ дан 8 December 2019 в 02:20
поделиться

Ну, Вы не можете намереваться написать запутываемый код, но я сказал бы, что Вы, конечно, пытаетесь.

Был бы две строки (или даже блок на одной строке, как Brent. Лонгборо предлагает) вместо одного, так плохи? Честно, это - причина, я обычно очень не хочу пытаться отлаживать/редактировать код жемчуга других народов, большое количество людей, которые пишут в жемчуге, кажется, одержимо выполнением почти всего самым "умным" возможным способом, вместо того, чтобы делать его способом это легко понять для кого-то еще чтение.

7
ответ дан 8 December 2019 в 02:20
поделиться

Вы могли или использовать @Brent. Ответ Longborough, или если Вы действительно хотите постфикс, делает:

do { die("Not a file: $_") unless -f $_ } foreach(@files);

Однако я соглашаюсь с другими, просто потому что это - "неважная часть", не означает, что краткий лучше. Количества удобочитаемости.

11
ответ дан 8 December 2019 в 02:20
поделиться

Если Вы не пытаетесь написать запутываемый код, то Вы не должны пытаться записать это как это. Вы берете что-то, что должно быть простым и мешать понять.

3
ответ дан 8 December 2019 в 02:20
поделиться

Если ошибочный тест является основной точкой этого кода, могло бы иметь смысл для него иметь лучшее расположение в начале строки. Небольшое улучшение должно было бы использовать grep:

die("Not a file: $_") for grep {!-f} @files;

Но если бы Вы планируете цикличное выполнение через файлы по некоторой другой причине в той части кода, было бы лучше добавить его к телу цикла.

5
ответ дан 8 December 2019 в 02:20
поделиться

Чертовски, Jon просто победил меня к grep.

Но у меня есть больший вопрос: как не важно, если Вы на самом деле собираетесь прыгнуть с парашютом при нахождении некоторых нефайлов в массиве? (В противоположность, скажем, удалению тех объектов, предупреждению пользователя и затем обработке остальной части списка.) Я думал бы, что уничтожение целой хижины является довольно важной частью программы.

В любом случае Вы не можете сделать точно, что Вы хотите с постфиксными модификаторами, так как у Вас может только быть одна вещь по обе стороны от них. Таким образом, у Вас не может быть обоих unless и foreach. От вершины соответствующего бита perldoc perlsyn:

Любой простой оператор может дополнительно сопровождаться ЕДИНСТВЕННЫМ модификатором, незадолго до завершающейся точки с запятой (или окончание блока).

0
ответ дан 8 December 2019 в 02:20
поделиться

Ты слишком много думаешь. Вот он на одной строчке без акробатики:

 foreach ( @files ) { die( "Not a file!" ) unless -f }

Вы можете поиграть с предметами внутри блока, чтобы разбить его, но удаление скобок и скобок вам не поможет, и, вероятно, запутает следующий программист, который должен на это взглянуть.

Возможно, у вас есть что-то более сложное, и это только пример. В реальном мире это становится еще проще:

not_a_file_die_die_die( \@files );

Вы переносите все сложные вещи в подпрограмму. Настоящая уловка состоит в том, чтобы кратко изложить идею и намерение , а не код, реализующий эту идею. Во многих случаях механика действительно не имеет значения; вы больше заботитесь о результате. В таких случаях не переживайте по поводу механики.

1
ответ дан 8 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: