2017-10-25 4 views
2

Ok 여기에 ...루아 - "self"를 사용하여 동일한 결과를 얻었습니다.

저는 매개 변수에 "self"라는 함수를 선언하는 다양한 예제를 실험 해 왔습니다.

나는 완전히 이해하려고 노력하고있는이 것을 완전히 이해하지 못했습니다. 나는 완전한 초심자이지만, 나는 이것을 완전히 이해해야 만한다.

예제 2에서 함수 내에 "self = {}"을 선언하지 않으면 "self"(또는 ":")를 함수 매개 변수가 작동합니다. 이게 "자아"와 관련이 있니?

"self"를 사용할 때 다른 의미가 있습니까?

예 1

function Character.new(x) 

    self = {} 

    self.name = x 

    return self.name 

end 



a = Character 

b = Character 

hobbit = a.new ("Frodo") 

dragon = b.new ("Smaug") 



print (hobbit) 

print (dragon) 

예 2

Character = {} 

function Character:new(x) 

    self.name = x 

    return self.name 

end 



a = Character 

b = Character 

hobbit = a:new ("Frodo") 

dragon = b:new ("Smaug") 



print (hobbit) 

print (dragon) 

; ^) Zalokin

+2

'self'는':'표기법으로 메소드를 정의 할 때 나타나는 암시 적 첫 번째 매개 변수입니다. 키워드가 아니기 때문에 항상 명시 적으로 선언 할 수 있습니다. – luther

답변

1

: 당신이 명시 적으로 (첫 번째 인수없이 함수 내에서 기능을 포함하는 테이블에 액세스 할 수 있습니다) 합격. 함수를 정의하고 호출 할 때 둘 다 사용할 수 있습니다.

아래 예제는 t 테이블을 포함합니다. 이 테이블에는 3 가지 기능 (a, bc)과 greeting 키 아래에 문자열 항목이 있습니다.

모든 함수/메소드 호출은 동일한 문자열 "hello user"를 인쇄합니다.

일반적인 함수와 동일한 방법으로 컨테이너 테이블이있는 함수를 계속 호출 할 수 있지만 테이블을 첫 번째 인수로 명시 적으로 전달해야합니다.

인수는 원하는대로 호출 할 수 있으며 함수 내에서 올바른 인수 이름 (이 경우 self이 아닌)을 사용하는 한 계속 :이라는 함수를 호출 할 수 있습니다. 이 함수의 예는 c입니다.

기본적으로 구문 설탕입니다.

local t = {} 

t.greeting = "hello" 

function t:a(name) 
    print(self.greeting, name) 
end 

function t.b(self, name) 
    print(self.greeting, name) 
end 

function t.c(myself, name) 
    print(myself.greeting, name) 
end 

t.a(t, "user") 

t:a("user") 

t.b(t, "user") 

t:b("user") 

t.c(t, "user") 

t:c("user") 
+0

마침내 모든 것을 이해하기 시작했습니다. – Zalokin

+1

이것은 내 생각의 과정입니다. 그래서 저와 함께 감내하십시오 ... 함수가 호출 될 때 - t는 객체 t를 가리 킵니다. 객체는 함수 매개 변수 "self"(또는 무엇이든)로 전달되고 객체 자체를 가리 킵니다. 함수가 출력 될 때, 객체 t를 고려하여 인사말 아래 필드를 인쇄합니다 ... – Zalokin

+0

방금 ​​간단한 예제를 고안했습니다. - t = {} t.greeting = "hello" function ta (z 이름) 인쇄 (z.greeting 이름) 단부 A1 = A2 t = t A3 = t a1 : A ("사용자 1") A2 : A ("유저 2 ") a3 : a ("사용자 3 ")' – Zalokin

2

는 인스턴스를 생성해야 할 때 전역 변수를 사용하고 있습니다.

대신이 라인을 시도, 그들은 당신이 이해하는 데 도움이 될 수

-- example 1 
print (hobbit) 
print(self.name) 
print (dragon) 
print(self.name) 

-- example 2 
print (hobbit) 
print(Character.name) 
print (dragon) 
print(Character.name) 
+0

이것은 더 이상하고 더 이상해집니다! 함수에서 self.name을 변수로 사용하여 예제 1을 사용하면 프로그램이 작동합니다. 그러나 예제 2에서는 (print (self.name)에서 멈춘다.) 그러나'Character.name '을 함수의 변수로 사용하면 두 예제 모두 작동합니다 (즉':'또는'.'). 이제 더 혼란 스럽네요. – Zalokin

관련 문제