최근에 스크립트를 디버깅하는 데 상당한 시간을 보냈으며 마침내 문제를 발견했을 때 다음과 같은 코드 때문이었습니다.
class Foo {
has $.bar;
method () {
# do stuff
$!.bar;
}
}
그것은 문제가 그와 함께했다 판명 $!.bar
중 하나 있었어야하는, $!bar
또는 $.bar
. 나는 이것을 얻는다.
그러나 왜 이것이 죽지 않습니까?
더 자세하게 살펴보면, 여기 문제처럼 보인다 나는 (존재하지 않는) 메소드를 호출하는 것을 시도하고 있다는 것입니다 bar
에 $!
이 시점에서, Nil
오류가 없었던 때문입니다.
그리고 실제로 내가 원하는 모든 메소드를 호출 할 수있는 것처럼 보이며 Nil
모두 and Nil
같은 것을 포함하여 모두 자동으로 반환 됩니다.Nil.this-is-a-fake-method
Nil.reverse-entropy(123)
이것이 기능입니까? 그렇다면 근거는 무엇입니까?
답변
그것은 의도되고 문서화되어 있습니다. 제목 Nil
은 “값 없음 또는 양성 실패”이며 클래스 문서에 언급되어 있습니다.
Nil
존재하지 않는 메소드를 호출하면 결과적으로 서브 스크립팅 조작이 성공하고 리턴Nil
됩니다.say Nil.ITotallyJustMadeThisUp; # OUTPUT: «Nil» say (Nil)[100]; # OUTPUT: «Nil» say (Nil){100}; # OUTPUT: «Nil»
개요 2 는 ” Nil
반환시 정의되지 않은 메소드 호출 Nil
이므로 Nil
메소드 호출 체인 을 전파합니다. Nil
리턴 에 대한 첨자 조작과 마찬가지로 Nil
“이므로 의도는 모든 단계에서 $foo.Bar()[0].Baz()
검사를 요구하지 않는 등의 표현식을 허용하는 것 같습니다. Nil
“메소드 호출 및 첨자 연산자.
답변
이 질문에 (그리고 홉스 ‘답)도 느끼게 … 불안했다 : 나는 결국 발견 https://docs.raku.org/language/traps : 그것은 그 할당이 설명 Nil
일반적으로 다른 값을 생성합니다 Any
. 다음과 같은 기본 REPL 상호 작용도이를 보여줍니다.
> my $foo = Nil
(Any)
> $foo.bar
No such method 'bar' for invocant of type 'Any'
in block <unit> at <unknown file> line 1
> my $bar := Nil
Nil
> $bar.baz
Nil
((차이 =
와는 :=
여기 피복 https://docs.raku.org/language/containers#Binding ))
… 일반적인 아이디어는 ‘결석 가치 또는 양성 실패’가 정규 코드에서 나보다 훨씬 덜 널리 퍼져 있다는 것입니다. 에 직접 호출하는 방법과 관련된 특정 우발적 상황에서 직접 일치 합니다$!
.
이로 인해 Nil
와 의 차이점에 대해 더 많이 알게 Any
되었고 제공된 근거가 더 의미가 있습니다.