код ниже:Порядок вывода
def a
print "Function 'a' called\n"
99
end
print "a=", a, "\n"
производит:
Function 'a' called
a=99
Почему function 'a' called
показать первый? Я ожидал, что a=
будет показан первым.
код ниже:Порядок вывода
def a
print "Function 'a' called\n"
99
end
print "a=", a, "\n"
производит:
Function 'a' called
a=99
Почему function 'a' called
показать первый? Я ожидал, что a=
будет показан первым.
Сначала вы определяете метод a
; пока ничего не напечатано.
Затем, когда вы добираетесь до последней строки, аргументы print
сначала оцениваются до того, как этот оператор печатает что-либо. Первый и последний аргументы являются строковыми литералами. Средний аргумент является вызовом метода a
, который печатает "Function 'a' called\n"
до возвращения 99.
Затем print
утверждение, что началось все это, наконец, готово к печати в настоящее время, что каждый из его аргументов были оценен.
Прежде чем передать аргументы методу, они будут оценены (чтобы у вас были значения для передачи). Оценка вызова функции a
имеет побочный эффект от печати "function 'a' called
. Вот почему он напечатан первым.
Во-первых, метод a
выполнен полностью, включая print "Function 'a' called\n"
. Только после возврата метода 99
может быть выполнена строка print "a=", a, "\n"
.
Подумайте об этом так: Возвращаемое значение a
должно быть известно до того, как оно будет напечатано в последней строке.
Заявление
print "a=", a, "\n"
обрабатывается как
print("a=", a(), "\n")
поэтому все параметры для вызова print
должны быть оценены, прежде чем она вызывается. Это означает сначала позвонить a
.
Если оператор должен был вывести a=
, прежде чем звонить a()
, он должен состоять из трех отдельных вызовов: print
.