2010-07-05 6 views
1

Ruby는 'Class.new'로 클래스를 생성하고 상수 (대문자)에 할당 할 때 "마술처럼"클래스 이름을 설정하는 매우 흥미로운 기능을 가지고 있습니다 상수와 일치합니다.lua - 변수 할당 할당하기

# This is ruby code 
MyRubyClass = Class.new(SuperClass) 
puts MyRubyClass.name # "MyRubyClass" 

루비는 할당을 "캡처"하고 삽입은 익명 클래스에 이름을 설정합니다.

루아에서 비슷한 것을 할 수있는 방법이 있는지 알고 싶습니다.

나는 내 자신의 클래스 시스템을 구축했지만, 그것이 작동하는 나는 두 번 같은 이름을 지정할 수있어 :

-- This is Lua code 
MyLuaClass = class('MyLuaClass', SuperClass) 
print(MyLuaClass.name) -- MyLuaClass 

내가 그 'MyLuaClass' 문자열을 제거하고 싶습니다. 루아에서 이것을 할 수있는 방법이 있습니까?

답변

4

전역 변수에 할당 할 때 전역 변수 테이블에 대해 __newindex 메타 메서드를 설정하여 클래스 변수의 할당을 catch하고 필요한 작업을 수행 할 수 있습니다.

적어도 루아 5.2과 관련하여
+0

이것은 가능하지만 매우 효율적이지는 않습니다. 전역 할당이 완료 될 때마다 루아 함수를 호출해야 할 것이다. 글로벌 할당이 최소한으로 유지되면 큰 문제가 아닐 수 있습니다. 힌트를 주려고 시도해 볼게. – kikito

+5

루아 함수를 호출하는 데 드는 비용은 그리 많지 않습니다. 성능에 문제가 있다면 C로 이동하거나 LuaJIT를 사용하십시오. 특히이 종류의 설정 작업 중 몇 가지 함수 호출은 무시할 수 있습니다. – Puppy

+0

이것이 최선의 방법이었습니다. 감사! – kikito

2

당신은 ...

> function class(name,superclass) _G[name] = {superclass=superclass} end 
> class('MyLuaClass',33) 
> =MyLuaClass 
table: 0x10010b900 
> =MyLuaClass.superclass 
33 
> 
+0

이것은 내 생각의 첫 걸음 중 하나였습니다. 다른 하나는 클래스에 __index 메소드를 사용하여 (테이블) - class.MyLuaClass (superclass)와 같이 될 것입니다. 그러나 가능하다면 할당 캡처에 대해 정말로 알고 싶었습니다. 당신의 노력에 +1. – kikito

0

별로을가 MyLuaClass의 언급 중 하나를 제거 할 수 있습니다. 루아는 객체 지향 언어가 아닙니다. 때로는 하나처럼 행동 할 수 있습니다. 그러나 매번 멀리에서. 루아에서는 클래스가 특별한 값이 아닙니다. 테이블에는 값을 넣었습니다. 가장 좋은 방법은 클래스 함수에서 _G의 키를 수동으로 설정하고 반환 값을 가져갈 필요가 없도록하는 것입니다.

정말 귀찮다면 debug.traceback()을 사용하고 스택 추적을 가져온 다음 호출하는 파일을 찾아 구문 분석하여 변수 이름을 찾을 수 있습니다. 그런 다음 설정하십시오. 그러나 그것은 조금 지나치게 과장된 것 이상입니다.

+0

루아가 매번 객체 지향 언어처럼 동작하도록하고 싶지는 않습니다. 내가 너 한테 그런 인상을 주면 사과한다. 방금 과제를 포착하는 방법을 알고 싶었습니다. 계속 찾아 볼게. – kikito

+0

@egarcia : 과제를 포착 할 수 없습니다. 루아는 할당을위한 메타 테이블 엔트리가 없다. 테이블에 지정, 네. 일반적으로 할당, 아니. – Puppy

0

: 당신 수에 캡처 할당) 루아 국가의 글로벌 테이블, __index 및 __newindex 메타 메서드 다른 루아 Object와도 이전 응답 및 B)에서 언급 한 바와 같이 (메타 테이블을 대체하여) 대체되었으므로, 나는 현재이 두 기술을 모두 사용하여 Lua 스크립트가 외부 C/C++ 자원 관리에 지정한 할당을 연결하고 리디렉션하는 것으로 확인할 수 있습니다. 다시 읽는 것과 관련하여 문제가 있지만 트릭은 Lua 상태로 값을 설정하지 못하게하는 것입니다. 거기에 존재하자마자 후크가 호출되지 않으므로이 경로로 내려가려면 모든 get/set 시도를 캡처해야하며 Lua 상태에 절대 값을 저장하지 않아야합니다.