какая польза от & ldquo; #! / usr / local / bin / ruby ​​-w & rdquo; в начале программы ruby

У меня такая же проблема на iOS 9. Попробуйте добавить ivar '_flag', а затем переопределите эти методы в контроллере view с помощью UIWebView

#pragma mark - Avoiding iOS bug

- (UIViewController *)presentingViewController {

    // Avoiding iOS bug. UIWebView with file input doesn't work in modal view controller

    if (_flagged) {
        return nil;
    } else {
       return [super presentingViewController];
    }
}

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {

    // Avoiding iOS bug. UIWebView with file input doesn't work in modal view controller

    if ([viewControllerToPresent isKindOfClass:[UIDocumentMenuViewController class]]
    ||[viewControllerToPresent isKindOfClass:[UIImagePickerController class]]) {
        _flagged = YES;
    }

    [super presentViewController:viewControllerToPresent animated:flag completion:completion];
}

- (void)trueDismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {

    // Avoiding iOS bug. UIWebView with file input doesn't work in modal view controller

    _flagged = NO;
    [self dismissViewControllerAnimated:flag completion:completion];
}

Это работает для меня отлично

29
задан Arup Rakshit 3 July 2013 в 12:42
поделиться

3 ответа

Строка Shebang является необязательной, и если вы запускаете интерпретатор ruby ​​и передаете ему сценарий в качестве аргумента командной строки, то флаги, которые вы устанавливаете в командной строке, являются флагами, с которыми работает ruby.

Линия Шебанга вовсе не является рубином (если вы не хотите называть это комментарием рубина). Это действительно сценарий оболочки. Большинство пользователей Linux и Unix используют оболочку BASH (расшифровывается как Borne Again SHell), но почти в каждой ОС есть интерпретатор команд, который будет соблюдать Shebang.

«#! / Usr / local / bin / ruby ​​-w»

Часть «she» - это октоторп (#), знак «решетка», знак числа, знак хеша и теперь хэш-тег ( Я до сих пор называю это крестики-нолики просто потому что).

Часть «взрыв» - это восклицательный знак (!), И это все равно, что бить кулаком по столу, чтобы воскликнуть команду.

В Windows «оболочка» - это командная строка, но даже без черного окна DOS интерпретатор команд будет запускать сценарий на основе сопоставления файлов. На самом деле не имеет значения, читает ли интерпретатор команд или язык программирования шебанг и следит за соблюдением флагов, важно то, что они соблюдаются.

"-w" - это флаг. По сути, это инструкция для ruby, которой нужно следовать при запуске скрипта. В этом случае «-w» включает предупреждения, поэтому вы получите дополнительные предупреждения (скрипт продолжает работать) или ошибки (скрипт останавливается) во время выполнения скрипта. Предупреждения и исключения могут быть обнаружены и применены во время программы. Это помогает программистам находить проблемы, которые приводят к неожиданному поведению.

Я фанат быстрых и грязных сценариев, чтобы выполнить работу, так что нет -у. Я также фанат высококачественного многоразового кодирования, так что обязательно используйте -w. Правильный инструмент для правильной работы. Если вы учитесь, всегда используйте -w. Когда вы узнаете, что делаете, и перестанете использовать -w для быстрых задач, вы начнете понимать, когда это помогло бы использовать -w вместо того, чтобы тратить часы на устранение неполадок. (Подсказка: когда причина проблемы не совсем очевидна, просто добавьте -w и запустите ее, чтобы увидеть, что у вас получится).

«- w» требует некоторого дополнительного кодирования, чтобы прояснить для ruby, что вы имеете в виду, поэтому это не решает сразу, но если вы уже напишите код с -w, у вас не будет много проблема с добавлением необходимых битов для запуска небольшого скрипта с предупреждениями. Фактически, если вы привыкли использовать -w, вы, вероятно, уже пишете код таким образом, и -w ничего не изменит, если вы что-то забудете. Ruby требует гораздо меньшего количества «программного кода», чем большинство (возможно, все) скомпилированных языков, таких как C ++, поэтому выбор не использовать -w не позволяет вам сэкономить много времени на наборе текста, он просто позволяет меньше думать перед тем, как пытаться запустить скрипт (IMHO) ).

-v - это подробный режим, и он НЕ меняет работу скрипта (никаких предупреждений не возникает, нет остановки скрипта в новых местах). Несколько сайтов и обсуждений вызывают -w подробный режим, но -w является режимом предупреждения, и это меняет выполнение скрипта.

24
ответ дан Able Mac 3 July 2013 в 12:42
поделиться

Хотя поведение выполнения строки shebang не переводится непосредственно в мир Windows, флаги, включенные в эту строку (например, -w в вашем вопросе), действительно влияют на работающий скрипт Ruby.

Пример 1 на компьютере с Windows:

#!/usr/local/bin/ruby -w
puts $VERBOSE   # true

Пример 2 на компьютере с Windows:

#!/usr/local/bin/ruby
puts $VERBOSE   # false
8
ответ дан FMc 3 July 2013 в 12:42
поделиться

Он называется Шебанг . Он сообщает загрузчику программы, какую команду использовать для выполнения файла. Поэтому, когда вы запускаете ./myscript.rb, это на самом деле переводится как /usr/local/bin/ruby -w ./myscript.rb.

Windows использует ассоциации файлов для той же цели; линия Шебанга не имеет никакого эффекта (правка: см. ответ FMC), но также не причиняет вреда.

Переносимый способ (работающий, скажем, при Cygwin и RVM ) будет:

#!/usr/bin/env ruby

. Это будет использовать команду env , чтобы выяснить, где Ruby интерпретатор, и запустить его.

Редактировать: по-видимому, именно Cygwin будет плохо себя вести с /usr/bin/env ruby -w и попытаться найти ruby -w вместо ruby. Возможно, вы захотите поместить эффект -w в сам скрипт.

63
ответ дан Koterpillar 3 July 2013 в 12:42
поделиться
Другие вопросы по тегам:

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