Lua에서 호출된 함수는 점호와 사칭의 차이를 사용합니다

3416 단어
본고는 대상을 대상으로 예열편을 하고 함수 두 가지 호출 방식의 차이를 설명하기 때문에 초보자는 비교적 쉽게 구덩이에 빠진다.
1. 초보자가 가장 혼란스러워하는 Top1 - 함수를 호출할 때 점호를 사용합니까 아니면 사칭을 사용합니까?
다음 코드를 살펴보겠습니다.
 
  
mSprite.setPosition(100, 20);
mSprite:setPosition(100, 20);

루아를 처음 만난 친구에게 악몽이었다. 함수 호출은 두 가지 형식이 있는데 우리가 마음대로 고르라는 말인가?이 두 가지 형식은 차이가 있는데, 차이가 매우 크지만, 단지 하나뿐이다.단, 잠시 설명하지 않고 나중에 소개하겠습니다.
2. 가장 간단한 유형
먼저 간단한 것을 보고 '클래스' 를 만들어 봅시다. 다음 코드는 다음과 같습니다.
 
  
    TSprite = {
        x = 0,
        y = 0,
    }
    function TSprite.setPosition(x, y)
        TSprite.x = x;
        TSprite.y = y;
    end
  
    TSprite.setPosition(1, 2);
    print("TSprite (" .. TSprite.x .. "," .. TSprite.y .. ")");

사실은 테이블을 만들었습니다. 이 테이블에 필드를 추가할 뿐입니다.출력 결과는 다음과 같습니다.
 
  
[LUA-print] TSprite (1,2)

setPosition 함수를 유의하십시오. 함수에서도 Tsprite를 통해 x와 y 필드를 호출합니다.
그리고 setPosition을 사용하는 방식은 점호를 사용하는 것입니다. 이것은 정통 함수 호출 방식입니다. 기억하십시오.
3. 실명 안 써도 돼요?self의 역할
만약 여러분이 비교적 민감하다면 방금 전의 예가 매우 문제가 있다는 것을 발견할 수 있을 것입니다. 만약에 우리가 이렇게 호출한다면:
 
  
    local who = TSprite;
    TSprite = nil;
  
    who.setPosition(1, 2);

이렇게 하면 반드시 오류가 발생할 것입니다. 비록 who를 통해 setPosition 함수를 성공적으로 호출할 수 있지만, 함수에는 Tsprite가 필요합니다. 이때 Tsprite는 이미 nil입니다.그래서 똑똑한 우리는 이렇게 할 수 있다.
 
  
    TSprite = {
        x = 0,
        y = 0,
    }
    function TSprite.setPosition(self, x, y)
        self.x = x;
        self.y = y;
    end
  
    local who = TSprite;
    TSprite = nil;
    
    who.setPosition(who, 1, 2);
    print("TSprite (" .. who.x .. "," .. who.y .. ")");

출력 결과는 다음과 같습니다.
 
  
[LUA-print] TSprite (1,2)

setPosition의 첫 번째 파라미터를 유의하십시오. 이 파라미터는 Tsprite 자체입니다.
따라서 setPosition 함수를 호출할 때 who로 전송되고 who의 내용은 Tsprite의 내용이므로 setPosition은 정상적으로 실행될 수 있습니다.
4. 게으름을 피우는 전통적인 미덕 - 기본적인self 파라미터와 기본적인self 파라미터 전달
만약 당신이 고(chao)지(ji)상(lan)원인에게 매번 함수와 호출 함수를 만들 때마다self를 이렇게 처리하라고 한다면, 그는 반드시 "이리 좀 와봐. 너를 죽이지 않을 거야."라고 말할 것이다.
그래서 루아는 새로운 사용 방식을 제공했다. 그래, 바로 사칭이다.
잘 봐라, 내가 말한 것은, 사칭으로 함수를 호출하는 것이다.다음 코드:
 
  
    TSprite = {
        x = 0,
        y = 0,
    }
    function TSprite:setPosition(x, y)
        self.x = x;
        self.y = y;
    end
    local who = TSprite;
    TSprite = nil;
    
    who:setPosition(1, 2);

첫째, setPosition 함수의 정의를 유의하고 사칭을 사용했다.둘째, setPosition 함수의 호출을 유의하고 사칭을 사용했습니다.
사칭의 역할은 함수를 정의할 때 함수에 숨겨진 첫 번째 인자self를 추가하는 것이다.함수를 호출할 때, 기본적으로 현재 호출자를 첫 번째 매개 변수로 전달합니다.
사칭을 사용한 후에 우리가 방금 점호를 사용했을 때와 같다. 단지 우리는self 파라미터를 현저하게 정의하고 who 파라미터를 주동적으로 전달할 필요가 없다.자, 이것이 바로 점호와 사칭의 차이입니다. 사칭은 우리에게 게으름을 피우기 위해 탄생한 것이라고 할 수 있습니다.코코스2d-x lua를 사용해 개발했다면 대부분 콜론을 사용했을 것이다.이유는 간단하다. 대부분의 경우 C++의this 키워드처럼 self 파라미터를 사용해야 하기 때문이다.
5.끝
다음 편은 본격적으로 대상을 향한 내용으로 넘어가 원표와 원법 등 기초를 잊지 않고 대상을 향한 내용에 활용해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기