[raku] Nil에서 모든 메소드를 호출 할 수 있으며 이것이 잘못 느껴집니다.

최근에 스크립트를 디버깅하는 데 상당한 시간을 보냈으며 마침내 문제를 발견했을 때 다음과 같은 코드 때문이었습니다.

class Foo {
    has $.bar;
    method () {
        # do stuff
        $!.bar;
    }
}

그것은 문제가 그와 함께했다 판명 $!.bar중 하나 있었어야하는, $!bar또는 $.bar. 나는 이것을 얻는다.

그러나 왜 이것이 죽지 않습니까?

더 자세하게 살펴보면, 여기 문제처럼 보인다 나는 (존재하지 않는) 메소드를 호출하는 것을 시도하고 있다는 것입니다 bar$!이 시점에서, Nil오류가 없었던 때문입니다.

그리고 실제로 내가 원하는 모든 메소드를 호출 할 수있는 것처럼 보이며 Nil모두 and Nil같은 것을 포함하여 모두 자동으로 반환 됩니다.Nil.this-is-a-fake-methodNil.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되었고 제공된 근거가 더 의미가 있습니다.


답변