Scala закрывает на Википедию

Вот сводка способов назвать внешние программы и преимущества и недостатки каждого:

  1. os.system("some_command with args") передачи команда и аргументы оболочке Вашей системы. Это хорошо, потому что можно на самом деле выполнить несколько команд сразу этим способом и настроить перенаправление ввода/вывода и каналы. Например:

    os.system("some_command < input_file | another_command > output_file")  
    

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

  2. stream = os.popen("some_command with args") сделает то же самое как os.system за исключением того, что оно дает Вам подобный файлу объект, который можно использовать для доступа к стандартному вводу/выводу для того процесса. Существует 3 других варианта popen что весь дескриптор i/o немного по-другому. Если Вы передаете все как строку, то Ваша команда передается оболочке; при передаче их как списка затем, Вы не должны волноваться о выходе ни из чего. См. документация .

  3. Popen класс subprocess модуль. Это предназначается как замена для [1 110], но имеет оборотную сторону того, чтобы быть немного более сложным на основании того, чтобы быть настолько всесторонним. Например, Вы сказали бы:

    print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()
    

    вместо:

    print os.popen("echo Hello World").read()
    

    , но хорошо иметь все опции там в одном объединенном классе вместо 4 различных функций popen. См. документация .

  4. Эти call функция от subprocess модуль. Это в основном точно так же, как Popen класс и берет все те же аргументы, но он просто ожидает, пока команда не завершает и дает Вам код возврата. Например:

    return_code = subprocess.call("echo Hello World", shell=True)  
    

    См. документация .

  5. , Если Вы находитесь на Python 3.5 или позже, можно использовать новое subprocess.run функция, которая много похожа на вышеупомянутое, но еще более гибкий и возвращается CompletedProcess объект, когда команда заканчивает выполняться.

  6. модуль OS также имеет все функции ветвления/должностного лица/икры, которые Вы имели бы в программе C, но я не рекомендую использовать их непосредственно.

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

Наконец знать, что для всех методов, куда Вы передаете заключительную команду, которая будет выполняться оболочкой как, строка и Вы ответственна за выход из него. существуют серьезные последствия безопасности , если какой-либо части строки, которую Вы передаете, нельзя полностью доверять. Например, если пользователь вводит некоторую/любую часть строки. Если Вы не уверены, только используйте эти методы с константами. Чтобы дать Вам подсказку последствий рассматривают этот код:

print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()

и предполагают, что пользователь входит, что-то "моя мама не любило меня & & комната-rf /" который мог стереть целую файловую систему.

9
задан Schildmeijer 16 August 2009 в 13:15
поделиться

2 ответа

Ну ... если вы хотите быть техническим, это функциональный литерал, который транслируется во время выполнения в закрытие, закрывая открытые термины (привязывая их к val / var в области видимости). функционального литерала). Кроме того, в контексте этого литерала функции ( _. Sales> = threshold ), threshold является свободной переменной , поскольку сам функциональный литерал не придать ему какой-либо смысл. Само по себе _. Sales> = threshold является открытым термином Во время выполнения он привязывается к локальной переменной функции при каждом вызове функции.

Take эта функция, например, генерирует замыкания:

def makeIncrementer(inc: Int): (Int => Int) = (x: Int) => x + inc

Во время выполнения следующий код создает 3 замыкания. Это' s также интересно отметить, что b и c не являются одним и тем же закрытием ( b == c дает false ).

val a = makeIncrementer(10)
val b = makeIncrementer(20)
val c = makeIncrementer(20)

Я все еще думаю, что пример, приведенный в Википедии, является хорошим , хотя и не в полной мере. Довольно сложно привести пример фактического закрытия по самому строгому определению без фактического дампа памяти запущенной программы. То же самое и с отношением класс-объект. Обычно вы даете пример объекта, определяя класс Foo {... а затем создать его экземпляр с помощью val f = new Foo , заявив, что f является объектом.

- Flaviu Cipcigan

Примечания:

  • Ссылка: Programming in Scala, Martin Odersky, Lex Spoon , Билл Веннерс
  • Код, скомпилированный с помощью Scala версии 2.7.5.final, работающей на Java 1.6.0_14.
14
ответ дан 4 December 2019 в 13:49
поделиться

Я не совсем уверен, но думаю, что вы правы. Разве закрытие не требует состояния (я думаю, свободные переменные ...)?

Или, может быть, bookList - это свободная переменная?

1
ответ дан 4 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

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