Более практическую разницу между Block
и Module
можно увидеть здесь:
Module[{x}, x]
Block[{x}, x]
(*
-> x$1979
x
*)
Поэтому, если вы хотите вернуть, например, x
, вы можете использовать Block
. Например,
Plot[D[Sin[x], x], {x, 0, 10}]
не работает; чтобы заставить его работать, можно было бы использовать
Plot[Block[{x}, D[Sin[x], x]], {x, 0, 10}]
(конечно, это не идеально, это просто пример).
Другое использование - это что-то вроде Block[{$RecursionLimit = 1000},...]
, которое временно заменяет $RecursionLimit
(Module
не сработало бы, поскольку оно переименовывает $RecursionLimit
).
Можно также использовать Block
для блокировки оценки чего-либо, например
Block[{Sin}, Sin[.5]] // Trace
(*
-> {Block[{Sin},Sin[0.5]],Sin[0.5],0.479426}
*)
т. е. он возвращает Sin[0.5]
, который оценивается только после завершения выполнения Block
. Это потому, что Sin
внутри Block
— это просто символ, а не функция синуса. Вы могли бы даже сделать что-то вроде
Block[{Sin = Cos[#/4] &}, Sin[Pi]]
(*
-> 1/Sqrt[2]
*)
(используйте Trace
, чтобы увидеть, как это работает). Таким образом, вы также можете использовать Block
для локального переопределения встроенных функций:
Block[{Plus = Times}, 3 + 2]
(*
-> 6
*)
person
acl
schedule
12.07.2011