Почему сложные выражения? - PullRequest
10 голосов
/ 07 марта 2020

Это пример из книги, которую я читаю:

volume = begin
    len = 10
    breadth = 20
    height = 30
    len * breadth * height
end

Зачем мне нужны составные выражения ?? Я мог бы просто написать volume = 10 * 20 * 30 или volume = len * breadth * height или написать функцию для этой или анонимной функции ...

Почему я использую begin и end? Или, возможно, лучший вопрос: Когда я использую их, как я полагаю, приведенный выше пример из книги, вероятно, не очень хорош.

Ответы [ 4 ]

7 голосов
/ 07 марта 2020

Чтобы обобщить то, что сказали все остальные: блоки позволяют преобразовать список операторов (syntacti c "фраз", которые не имеют значений, т. Е. Не могут быть назначены) в один выражение («фраза», представляющая значения, и может быть назначена ).

Например, если вы этого не сделаете, вы можете написать

x = begin
    s = 0
    for i = 1:10
        s += i^2
    end
    s
end

, чтобы присвоить x результату операции цикла. (С ограничением, что последний оператор в последовательности должен фактически быть выражением - иначе у вас не будет никакого значения для выражения.)

Допустимый вариант использования этого - сгенерированный код. Например, вы могли бы

x = @somthing bla blub

в

x = begin
   (stuff involving bla and blub)
end

прозрачно для пользователя, тогда как @something может свободно генерировать любые языковые конструкции.

Или если Вы хотите написать анонимную функцию с более длинным телом (и не использовать форму function):

f = x -> begin
   ...
end
6 голосов
/ 07 марта 2020

Одно использование для этих блоков находится в понимании:

A = [ begin
           x = y^2
           x - x^2 + 2
         end
         for y = 1:5 ]

Вы можете создать функцию и использовать ее вместо этого в понимании, но иногда это удобно. Он используется всякий раз, когда вы хотите где-нибудь использовать многострочный блок кода, например, для передачи в качестве аргумента макросу (который очень часто используется для @testset из стандартной библиотеки Test).

5 голосов
/ 07 марта 2020

Проще говоря: «начало» просто обозначает блок кода (см. Документацию по этому вопросу: https://docs.julialang.org/en/v1/base/base/#begin).

В приведенном выше примере не ясно, есть ли какое-либо значение для использования блока начала вместо объявления функции.

Я не вижу, чтобы это ключевое слово использовалось в коде очень часто, и я лично я никогда не использовал это на практике. Мое предложение так просто использовать функцию, так как она будет делать то же самое.

4 голосов
/ 07 марта 2020

Полагаю, во многих ситуациях удобны begin ... end блоки , но, как вы заметили, вы часто можете добиться аналогичного эффекта и с другими конструкциями, такими как функции и т. Д. c.

Для чего можно использовать begin ... end блоки?

  • Чтобы просто "содержать" переменные и их имена: len, breadth и height будут существовать только внутри блок и не загрязняют окружающее пространство имен.
  • Для применения макросов к блоку кода, а не к отдельным операторам. Например, @inbounds begin <all my code without bounds checking goes here> end или обтекание @time begin ... end вокруг фрагмента кода.
  • Чтобы создать локальную область видимости в окружающей глобальной области видимости (например, чтобы избежать беспорядка глобальной области видимости ). (Обратите внимание, что, как было отмечено в комментариях, begin ... end не вводит локальную область, но аргумент сохраняется для аналогичного let ... end блока.)

In В частности, второй момент - то, для чего я их использую в своих кодах.

...