많은 언어는 파이썬을 포함하여 표현식이 아닌 명령문을 지정하는 경로를 선택합니다.
foo = 42 # works
if foo = 42: print "hi" # dies
bar(foo = 42) # keyword arg
그리고 Golang :
var foo int
foo = 42 # works
if foo = 42 { fmt.Printn("hi") } # dies
다른 언어에는 할당이 없지만 범위가 지정된 바인딩 (예 : OCaml)이 있습니다.
let foo = 42 in
if foo = 42 then
print_string "hi"
그러나 let
표현 자체입니다.
할당을 허용하는 이점은 조건부 내부에서 함수의 반환 값을 직접 확인할 수 있다는 것입니다 (예 :이 Perl 스 니펫).
if (my $result = some_computation()) {
say "We succeeded, and the result is $result";
}
else {
warn "Failed with $result";
}
Perl은 선언을 해당 조건부로만 범위를 지정하므로 매우 유용합니다. 또한 새 변수를 선언하지 않고 조건부 내부에 할당 if ($foo = $bar)
하면 경고 if (my $foo = $bar)
합니다.
다른 문장으로 과제를 작성하면 충분하지만 범위 지정 문제가 발생할 수 있습니다.
my $result = some_computation()
if ($result) {
say "We succeeded, and the result is $result";
}
else {
warn "Failed with $result";
}
# $result is still visible here - eek!
Golang은 오류 검사를 위해 반환 값에 크게 의존합니다. 따라서 조건부에서 초기화 명령문을 취할 수 있습니다.
if result, err := some_computation(); err != nil {
fmt.Printf("Failed with %d", result)
}
fmt.Printf("We succeeded, and the result is %d\n", result)
다른 언어는 유형 시스템을 사용하여 조건부 내에서 부울이 아닌 표현식을 허용하지 않습니다.
int foo;
if (foo = bar()) // Java does not like this
물론 부울을 반환하는 함수를 사용할 때 실패합니다.
우연히 할당을 방지하기 위해 다른 메커니즘을 보았습니다.
- 식으로 할당을 허용하지 않음
- 정적 유형 검사 사용
- 과제가 존재하지 않으며
let
바인딩 만 있습니다.
- 초기화 문장을 허용하고 그렇지 않으면 할당을 허용하지 않습니다
- 선언없이 조건부 내에서 할당을 허용하지 않습니다.
나는 선호하는 오름차순으로 순위를 매겼습니다. 표현식 내부의 할당은 유용 할 수 있습니다 (명시 적 선언 구문과 다른 명명 된 인수 구문을 사용하여 Python의 문제를 피하는 것이 간단합니다). 그러나 동일한 효과에 대한 다른 많은 옵션이 있으므로 허용하지 않는 것이 좋습니다.
버그가없는 코드는 간결한 코드보다 중요합니다.