참조 클래스 생성기는 클래스 자체와 동일한 이름을 가져야합니까?

mchen

클래스 생성자에게 클래스 자체에 다른 이름을 부여했을 때 (이를 수행하는 합법적 인 이유가 있음) 문제가 발생하기 시작했습니다.

myClassGen <- setRefClass("myClass",
    methods = list(foo = function() baz())
)
myClassGen$methods(baz = function() "baz")

myObj <- myClassGen()
myObj$foo()

결과 :

Error in myObj$foo() : could not find function "baz"

그러나 방법은 baz명확하게 존재합니다.

> myObj$baz
Class method definition for method baz()
function () 
"baz"
<environment: 0x000000002c60f0b8>

생성기 이름을으로 변경하면 위의 오류가 발생하지 않습니다 myClass.

이 동작이 의도적으로 설계된 것이라면 그 이유는 무엇입니까? 이것이 버그 인 경우 어떻게이 문제를 해결할 수 있습니까? 다른 이름을 가진 생성기와 클래스로 인한 또 다른 숨겨진 문제가 있습니까?

발굴

baz()클래스 인스턴스에서 호출 해야하는 것을 지정해야합니다 .self.

myClassGen <- setRefClass("myClass",methods = list(foo = function() .self$baz()))
myClassGen$methods(baz = function() "baz")

myObj <- myClassGen()
myObj$foo()
# [1] "baz"

따라서 문제는 다음 코드가 작동하지 않기 때문에 클래스 생성기의 이름이 클래스 이름과 다른 것과 관련이 없습니다 .self.

myClass <- setRefClass("myClass", methods = list(foo = function() baz()))
myClass$methods(baz = function() "baz")

myObj <- myClass()
myObj$foo()
# Error in myObj$foo() : could not find function "baz"

참조 클래스에 대한 공식 문서는 여기에 있습니다 .


편집 (댓글에 따라) :

$methods(...)기능 상태 에 관한 섹션의 문서 :

새 메소드는 이름으로 현재 정의 된 모든 메소드를 참조 할 수 있습니다 ($ methods ()에 대한이 호출에서 제공되는 다른 메소드 포함). 이전에 정의 된 메소드는 재분석되지 않는다는 것은 새 메소드를 호출하지 않음을 의미합니다 (재정의하지 않는 한). 동일한 이름의 기존 방법).

올바르게 이해했다면 baz이전에 정의 된 메서드로 새로 추가 된 메서드 를 호출 할 수 없음을 의미합니다 foo. 그렇다면 왜 .self$foo()잘 작동합니까?
확실하지는 않지만 위의 텍스트에 언급 된 방법 분석 과 관련이 있다고 생각합니다 .
아마도 통해 정의 된 메서드 setRefClass가 구문 분석되고 다른 클래스 메서드에 대한 호출이 발견되면 해당 호출이 해당 클래스 메서드에 명시 적으로 연결되어 동일한 이름을 가진 기존 함수와 혼동을 피할 수 있습니다 (과도하게 단순화하여 이러한 호출이 접두사에 .self$) 가 붙습니다 .
대신에 대한 메서드 호출 .self$something()은 이미 명시 적이므로 수정되지 않습니다.

이것은 다음 테스트에서 합리적으로 뒷받침되는 것 같습니다. 예를 들어 다음 코드를 실행하면 :

myClassGen <- setRefClass("myClass", methods = list(foo = function() baz(), 
                                                    baz = function() "baz"))
myObj <- myClassGen()
myObj$foo

우리는 얻는다 :

Class method definition for method foo()
function () 
baz()
<environment: 0x000000000e490938>

 Methods used:  
    "baz"

클래스 메서드 baz메서드 에서 사용 된다는 마지막 줄을 볼 수 있습니다 foo.

대신 이것을 실행하면 :

myClassGen <- setRefClass("myClass",methods = list(foo = function() .self$baz(), 
                                                   baz = function() "baz"))
myObj <- myClassGen()
myObj$foo

우리는 얻는다 :

Class method definition for method foo()
function () 
.self$baz()
<environment: 0x00000000107ab5c8>

클래스 메소드에 대한 언급이 없습니다 baz.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Javascript 클래스가 동일한 생성자를 참조하는 이유는 무엇입니까?

분류에서Dev

Java 객체 클래스는 자체 대신 동일한 이중 배열을 참조합니다.

분류에서Dev

신속하게 내 클래스에 동일한 이름의 하위 클래스가있을 때 최상위 클래스를 참조하는 방법

분류에서Dev

다른 클래스에서 한 클래스의 속성을 참조합니까?

분류에서Dev

동일한 어셈블리 내의 자체 참조 클래스 또는 순환 참조 클래스가 성공적으로 컴파일되는 방법

분류에서Dev

구조체 클래스가있는 해시에 대한 참조

분류에서Dev

다른 클래스를 상속하는 클래스가 '다른 클래스'와 동일한 결과를 생성하지 않는 이유는 무엇입니까?

분류에서Dev

동일한 네임 스페이스와 동일한 클래스 이름을 가진 클래스 상속

분류에서Dev

선언을 사용하여 생성 된 생성자가 기본 클래스와 동일한 액세스 수준을 갖는 이유는 무엇입니까?

분류에서Dev

다른 클래스의 방법 지역 내부 클래스와 동일한 이름을 가진 클래스에 액세스하는 방법

분류에서Dev

이 클래스의 복사 생성자, operator = 및 참조에 컴파일 문제가있는 이유

분류에서Dev

파일 작성기 클래스가 생성하는 파일의 이름을 조작 할 수 없습니다.

분류에서Dev

벡터의 클래스 멤버에 대한 참조가 다른 객체에 대해 동일한 값을 가리키는 이유는 무엇입니까?

분류에서Dev

동일한 클래스 / 구조체에서 동일한 서명을 가진 동일한 기능? 초과 적재?

분류에서Dev

파이썬에서 클래스 X 자체의 멤버 함수에서 클래스 X의 객체를 생성하고 객체 참조에서 작동하는 것이 가능합니까?

분류에서Dev

onClick 요소는 클래스 이름이 동일한 관련 div에 클래스 이름을 추가합니다.

분류에서Dev

TypeScript는 클래스 매핑 객체에 대한 문자열 이름을 동적으로 생성합니다.

분류에서Dev

파생 클래스 개체에 대한 기본 클래스 참조

분류에서Dev

이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

분류에서Dev

이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

분류에서Dev

이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

분류에서Dev

기본 클래스 참조로 파생 클래스 메서드를 호출 할 수 없을 때 동적 다형성이 어떻게 유용한가요?

분류에서Dev

가장 유사한 자동차에 대한 Django 자기 참조 클래스

분류에서Dev

Matlab 클래스에서 자체 참조하는 더 깨끗한 방법이 있습니까?

분류에서Dev

부모 클래스와 동일한 매개 변수가있는 경우 자식 클래스가 생성자를 재정의해야합니까?

분류에서Dev

서브 클래스 객체에 대한 수퍼 클래스 참조 변수는 최상위의 대신에 서브 클래스의 속성을 액세스

분류에서Dev

C ++ 클래스 함수가 클래스 자체에 대한 참조를 전달합니까?

분류에서Dev

Java 클래스가 자체 참조 유형으로 작동하는 방법

분류에서Dev

부모 클래스 네임 스페이스 / 클래스 공간으로 자식 클래스를 참조하는 방법이 있습니까?

Related 관련 기사

  1. 1

    Javascript 클래스가 동일한 생성자를 참조하는 이유는 무엇입니까?

  2. 2

    Java 객체 클래스는 자체 대신 동일한 이중 배열을 참조합니다.

  3. 3

    신속하게 내 클래스에 동일한 이름의 하위 클래스가있을 때 최상위 클래스를 참조하는 방법

  4. 4

    다른 클래스에서 한 클래스의 속성을 참조합니까?

  5. 5

    동일한 어셈블리 내의 자체 참조 클래스 또는 순환 참조 클래스가 성공적으로 컴파일되는 방법

  6. 6

    구조체 클래스가있는 해시에 대한 참조

  7. 7

    다른 클래스를 상속하는 클래스가 '다른 클래스'와 동일한 결과를 생성하지 않는 이유는 무엇입니까?

  8. 8

    동일한 네임 스페이스와 동일한 클래스 이름을 가진 클래스 상속

  9. 9

    선언을 사용하여 생성 된 생성자가 기본 클래스와 동일한 액세스 수준을 갖는 이유는 무엇입니까?

  10. 10

    다른 클래스의 방법 지역 내부 클래스와 동일한 이름을 가진 클래스에 액세스하는 방법

  11. 11

    이 클래스의 복사 생성자, operator = 및 참조에 컴파일 문제가있는 이유

  12. 12

    파일 작성기 클래스가 생성하는 파일의 이름을 조작 할 수 없습니다.

  13. 13

    벡터의 클래스 멤버에 대한 참조가 다른 객체에 대해 동일한 값을 가리키는 이유는 무엇입니까?

  14. 14

    동일한 클래스 / 구조체에서 동일한 서명을 가진 동일한 기능? 초과 적재?

  15. 15

    파이썬에서 클래스 X 자체의 멤버 함수에서 클래스 X의 객체를 생성하고 객체 참조에서 작동하는 것이 가능합니까?

  16. 16

    onClick 요소는 클래스 이름이 동일한 관련 div에 클래스 이름을 추가합니다.

  17. 17

    TypeScript는 클래스 매핑 객체에 대한 문자열 이름을 동적으로 생성합니다.

  18. 18

    파생 클래스 개체에 대한 기본 클래스 참조

  19. 19

    이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

  20. 20

    이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

  21. 21

    이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

  22. 22

    기본 클래스 참조로 파생 클래스 메서드를 호출 할 수 없을 때 동적 다형성이 어떻게 유용한가요?

  23. 23

    가장 유사한 자동차에 대한 Django 자기 참조 클래스

  24. 24

    Matlab 클래스에서 자체 참조하는 더 깨끗한 방법이 있습니까?

  25. 25

    부모 클래스와 동일한 매개 변수가있는 경우 자식 클래스가 생성자를 재정의해야합니까?

  26. 26

    서브 클래스 객체에 대한 수퍼 클래스 참조 변수는 최상위의 대신에 서브 클래스의 속성을 액세스

  27. 27

    C ++ 클래스 함수가 클래스 자체에 대한 참조를 전달합니까?

  28. 28

    Java 클래스가 자체 참조 유형으로 작동하는 방법

  29. 29

    부모 클래스 네임 스페이스 / 클래스 공간으로 자식 클래스를 참조하는 방법이 있습니까?

뜨겁다태그

보관