58 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: Clojure Create Local Variables with Let
							 | 
						|||
| 
								 | 
							
								localeTitle: Clojure Создание локальных переменных с Let
							 | 
						|||
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								`let` это фундаментальная часть Clojure. Если `def` создает глобальную переменную, `let` создает локальную переменную.
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								(def x 5) 
							 | 
						|||
| 
								 | 
							
								 (println x) 
							 | 
						|||
| 
								 | 
							
								 ; => 5 
							 | 
						|||
| 
								 | 
							
								 ;    nil 
							 | 
						|||
| 
								 | 
							
								 (let [x 2] 
							 | 
						|||
| 
								 | 
							
								  (println x)) 
							 | 
						|||
| 
								 | 
							
								 ; => 2 
							 | 
						|||
| 
								 | 
							
								 ;    nil 
							 | 
						|||
| 
								 | 
							
								 (println x) 
							 | 
						|||
| 
								 | 
							
								 ; => 5 
							 | 
						|||
| 
								 | 
							
								 ;    nil 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								 [IDEOne!](https://ideone.com/xcNth2)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								`x` в этом примере никогда не изменяется. `x` просто ссылается на что-то другое внутри нашей привязки `let` . Это может быть полезным способом избежать повторения внутри функции.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Это невероятно полезно. Слишком много глобальных переменных может привести к неприятным ошибкам и непреднамеренному поведению.
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								(def x 5) 
							 | 
						|||
| 
								 | 
							
								 (defn add-5 [y] (+ xy)) 
							 | 
						|||
| 
								 | 
							
								 (add-5 5) 
							 | 
						|||
| 
								 | 
							
								 ; => 10 
							 | 
						|||
| 
								 | 
							
								 (defn change-x [] 
							 | 
						|||
| 
								 | 
							
								  (def x 6)) 
							 | 
						|||
| 
								 | 
							
								 (change-x) 
							 | 
						|||
| 
								 | 
							
								 ; => nil 
							 | 
						|||
| 
								 | 
							
								 (add-5 5) 
							 | 
						|||
| 
								 | 
							
								 ; => 11 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								 [IDEOne!](https://ideone.com/MFjA3C)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								О, о! Это больше не добавляет 5! Конечно, этот пример немного глуп, но использование слишком большого числа глобальных переменных может привести к ошибкам, столь же страшным, как этот.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								**Примечание.** Мы не _переназначаем_ здесь `x` , как на языке C. Мы просто создаем новую переменную, которая также называется x. Это _очень, очень, **очень**_ плохая идея.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## Множественные привязки
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								`let` также может определять сразу несколько переменных и может назначать переменные выражениям.
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								(let [spam "foo" 
							 | 
						|||
| 
								 | 
							
								      ham (str "b" "ar")] ; str is a function that concatenates strings 
							 | 
						|||
| 
								 | 
							
								  (println spam ham))      ; or converts variables into strings. 
							 | 
						|||
| 
								 | 
							
								 ; => foo bar 
							 | 
						|||
| 
								 | 
							
								 ;    nil 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								 [IDEOne!](https://ideone.com/y5EBIM)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								| [ Предыдущая](//forum.freecodecamp.com/t/clojure-conditionals/18412) | [ Главная ](//forum.freecodecamp.com/t/clojure-resources/18422) | [следующий ](//forum.freecodecamp.com/t/clojure-loop-recur/18418) |  
							 | 
						|||
| 
								 | 
							
								| [Условные](//forum.freecodecamp.com/t/clojure-conditionals/18412) | [Содержание](//forum.freecodecamp.com/t/clojure-resources/18422) | [Loop и Recur](//forum.freecodecamp.com/t/clojure-loop-recur/18418) |
							 |