Это пример из книги, которую я читаю:
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
Зачем мне составные выражения ?? Я мог бы просто написать volume = 10 * 20 * 30
или volume = len * breadth * height
или написать функцию для этой или анонимной функции ...
Почему я использую begin
и end
? Или, возможно, лучший вопрос: когда я их использую, как я полагаю, приведенный выше пример из книги, вероятно, не очень хорош.
Ответы:
Я предполагаю, что есть много ситуаций, в которых
begin ... end
блоки удобны, но, как вы заметили, вы часто можете достичь аналогичного эффекта с другими конструкциями, такими как функции и т. Д.Для чего можно использовать
begin ... end
блоки?len
,,breadth
иheight
будет существовать только внутри блока и не загрязнять окружающее пространство имен.@inbounds begin <all my code without bounds checking goes here> end
или обернуть@time begin ... end
вокруг кусок кода.begin ... end
, не вводится локальная область, но аргумент сохраняется для аналогичногоlet ... end
блока.)В частности, второй момент - то, для чего я использую их в своих кодах.
источник
begin
блоки этого не вводить сферы . С другой стороны, они преобразуют последовательность операторов в выражение, что может быть удобно, если вы генерируете код с / из макроса.let ... end
что вводит локальную сферу. Исправлю мой ответ.begin
блоки вводят локальную область видимости.Чтобы обобщить то, что сказали все остальные: блоки позволяют преобразовывать список операторов (синтаксические «фразы», которые не имеют значений, т. Е. Не могут быть назначены) в одно выражение («фраза», которая представляет значения и может быть назначена). ).
Например, хотя вы не должны, вы можете написать
присваивать
x
результат зацикливания. (С ограничением, что последний оператор в последовательности должен быть на самом деле выражением - иначе у вас не будет значения для выражения.)Законным вариантом использования этого является сгенерированный код. Например, вы можете включить
в
прозрачно для пользователя, а
@something
может свободно генерировать любые языковые конструкции.Или, если вы хотите написать анонимную функцию с более длинным телом (и не использовать
function
форму):источник
x = y = 1
,a = if false end
иb = for i in 1:2 end
, после которогоx
имеет значение1
,a
иb
оба имеют значениеnothing
.if-else
отчете:a = if false; 1 else 2 end
. В этом случаеa
равных2
.setproperty!
/setindex!
, и для него «традиционно» важно иметь значение (в C-подобных языках). То же самоеif-else
, выражение в нескольких языках. Ноfor
иif
безelse
имея « по умолчанию» значениеnothing
, я вижу , что просто как артефакт.Одно использование для этих блоков в понимании:
Вы можете создать функцию и использовать ее вместо понимания, но иногда это удобно. Он используется всякий раз, когда вы хотите где-нибудь использовать многострочный блок кода, например, для передачи в качестве аргумента макросу (который очень часто используется
@testset
в стандартной библиотеке Test).источник
y^2 - y^4 + 2
в этом случае. Возможно, было бы лучше показать пример, где действительно нужны два (или более) шага.Проще говоря: «начало» просто обозначает блок кода (см. Документацию по этому адресу : https://docs.julialang.org/en/v1/base/base/#begin ).
В приведенном выше примере не ясно, есть ли какое-либо значение для использования начального блока по сравнению с объявлением функции.
Я не вижу, чтобы это ключевое слово использовалось в коде, и лично я никогда не использовал его на практике. Мое предложение так просто использовать функцию, так как она будет делать то же самое.
источник
progn
В LISP).