존재와 정의의 차이점은 무엇입니까?
차이점은 무엇입니까
if (defined $hash{$key}) { }
과
if (exists $hash{$key}) { }
어떤 것을 사용해야하는지 언제 알 수 있습니까?
이것은 defined
및 에 대한 perldoc 항목에 잘 설명되어 exists
있습니다. 다음은 간단한 요약입니다.
defined $hash{key}
주어진 키에 대한 값이 정의되었는지 여부를 알려줍니다 (예 : 아님 undef
). 정의되지 않은 값과 같은 부울 맥락에서 거짓 값을 구분하는 데 사용 0
하고 ''
.
exists $hash{key}
%hash
주어진 키가 포함되어 있는지 여부를 알려줍니다 . 정의되지 않은 값과 존재하지 않는 값을 구별하는 데 사용합니다.
예를 들어 보면 가장 쉽게 알 수 있습니다. 이 해시가 주어지면 :
my %hash = (a => 1, b => 0, c => undef);
검색, 정의 및 존재에 대한 결과는 다음과 같습니다.
# key value defined exists
a 1 1 1
b 0 1 1
c undef 0 1
d undef 0 0
실제로 사람들은 종종 if ($hash{key}) {...}
(대부분의 경우) 참 값만이 의미 있고 가능하기 때문에 글을 씁니다 . 거짓 값이 유효하면 테스트에 추가 해야합니다defined()
. exists()
훨씬 덜 자주 사용됩니다. 가장 일반적인 경우는 아마도 해시를 세트로 사용할 때입니다. 예 :
my %set = map { $_ => undef } 'a' .. 'z';
undef
설정 값에 사용 하면 몇 가지 장점이 있습니다.
- 의도를 더 정확하게 나타냅니다 (값이 아니라 키만 의미 있음).
- 모든
undef
값은 단일 할당을 공유합니다 (메모리 절약). exists()
테스트가 약간 더 빠릅니다 (Perl이 값을 검색 할 필요가없고 값이 하나만 있는지 확인하기 때문입니다).
또한 exists()
세트 멤버십을 확인하기 위해 사용해야하는 단점이있어 더 많은 타이핑이 필요하고 잊어 버리면 잘못된 작업을 수행합니다.
exists
유용한 또 다른 장소 는 값을 검색하기 전에 잠긴 해시를 조사하는 것입니다 (예외를 트리거 함).
defined
변수의 값을 확인하고 exists
이전에 선언 / 초기화되었는지 확인합니다. 존재한다면 단순하고 단순합니다.
예 :
$hash{$key} = undef;
# various return values:
exists $hash{$key}; # true
defined $hash{$key}; # false
$hash{$key}; # false
$hash{$key} = 0;
# various return values:
exists $hash{$key}; # true
defined $hash{$key}; # true
$hash{$key}; # false
exists $hash{$foo}; # false
Perl 문서 :
해시 요소에 사용되는 경우 defined 는 키가 해시에 있는지 여부가 아니라 값이 정의되었는지 여부를 알려줍니다. 사용은 존재 후자의 목적을 위해.
에 대한 perldoc에exists
명시된대로 :
해시의 요소를 지정하는 표현식이 주어지면 해당 값이 정의되지 않은 경우에도 해시의 지정된 요소가 초기화 된 적이 있으면 true를 반환합니다.
해시 또는 배열 요소는 존재하는 경우에만 정의되고 정의 된 경우에만 참일 수 있지만 그 반대가 반드시 참을 유지하는 것은 아닙니다.
즉, 해시는 정의되지 않은 요소를 포함 할 수 defined
있으며이 경우 -check는을 반환 false
하고 exists
-check는를 반환 true
합니다.
따라서 exists
주어진 항목이 해시에 존재 defined
하는지 알고 싶다면, 주어진 항목이 존재하고 정의되어 있는지 알고 싶다면를 사용해야합니다.
이 예는 차이점을 보여줍니다. 일반적으로 모든 구조에 대해 정의 된 작업 및 존재는 해시와 관련이 있습니다.
my %hash=("1"=>undef);
print "exists:".exists($hash{"1"})."\n";
print "defined:".defined($hash{"1"})."\n";
그 차이는 작고 분명하지 않으므로 사람들이 그것을 망칠 것이라고 기대하십시오.
참고 URL : https://stackoverflow.com/questions/6534573/whats-the-difference-between-exists-and-defined
'developer tip' 카테고리의 다른 글
java.sql.Connection에서 데이터베이스 URL을 얻는 방법은 무엇입니까? (0) | 2020.12.11 |
---|---|
변경 불가능한 구조체에 대해 공용 읽기 전용 필드를 사용합니까? (0) | 2020.12.11 |
애플리케이션 내에서 언어 (로케일)를 변경 한 후 활동을 새로 고치는 방법 (0) | 2020.12.11 |
ggplot2에서 로그 색상 스케일을 수행하는 기본 제공 방법이 있습니까? (0) | 2020.12.11 |
FXML 컨트롤러 클래스에 액세스 (0) | 2020.12.11 |