2016-12-21 4 views
4

루아의 문자열에 자신 만의 연산자와 메타 메서드를 추가 할 수 있습니까?문자열에 연산자를 오버로드 할 수 있습니까?

나는 이런 식으로 뭔가를 할 :

local str = "test" 

print(str[2]) --> "e" 
print(str()) --> "TEST" 
print(-str) --> "tset" 
print(str + "er") --> "tester" 
print(str * 2) --> "testtest" 

답변

5

네, 루아에서 문자열에 대한 "비밀"메타 테이블을 사용하여, 문자열에 대한 다른 연산자 오버로드의 수를 정의 할 수 있습니다. 당신이 테이블에서만 사용할 수 있기 때문에 setmetatable('',...)는 사용할 수 없습니다

getmetatable('').__index = function(str,i) return string.sub(str,i,i) end 
getmetatable('').__call = function(str,i) return string.upper(str) end 
getmetatable('').__unm = function(str,i) return string.reverse(str) end 
getmetatable('').__add = function(str,i) return (str .. i) end 
getmetatable('').__mul = function(str,i) return string.rep(str, i) end 

local str = "test" 

print(str[2]) --> "e" 
print(str()) --> "TEST" 
print(-str) --> "tset" 
print(str + "er") --> "tester" 
print(str * 2) --> "testtest" 

이유 :

다음 코드를 사용해보십시오. 그러나 위의 "해킹"을 사용하면 여러 메서드를 문자열에 쉽게 삽입 할 수 있습니다.

정말 필요한 경우 자신의 코드에서만이 코드를 사용하십시오. 프로젝트에서이 코드를 전역 적으로 사용하는 것과 충돌 할 수 있습니다.

그러나 문자열이나 데이터를 조작하는 적절한 방법은 모듈의 메서드를 사용하는 것입니다. 이 예제에서 제공되는 메타 메소드는 OOP 친화적이지 않고 정의 된 후 Lua의 범위에있는 모든 문자열에 영향을 미친다. 루아는 문자열의 메타 테이블을 편집 할 수있는 권한을 주지만 책임으로 사용해야합니다.

str:sub(), str:upper() 및 그 밖의 다른 방법으로는 전체 프로그램에서 문자열의 메타 기능을 변경하기 전에 사용해야하는 예제가 없어야합니다.

+2

또한 '__index'를 바꾸면 모든 기본 메소드가 nil이됩니다. – Mossarelli

+1

그래도 metable을 debug.setmetatable로 설정할 수 있습니다! – warspyking

+2

표준 함수를 유지하려면 : getmetatable ('') .__ index = function (str, i) 반환 유형 (i) == 'number'와 string.sub (str, i, i) 또는 string [i] end' –