2010-04-24 4 views
5

다음과 같이 나는 테이블에 문자열을 삽입하고 가정합니다루아에서는 사용자 정의 함수없이 N 번째 결과를 쉽게 선택할 수 있습니까?

table.insert(tbl, mystring) 

을하고 mystring이의 모든 항목을 대체하여 생성되는 "A", "B", input에서와 :

mystring = string.gsub(input, "a", "b") 

명백한을 방법은 결합 할 수있는 문이 작동하지 않습니다이 하나에, 반환이 개 결과 gsub 이유는

table.insert(tbl, string.gsub(input, "a", "b")) -- error! 
-- (second result of gsub is passed into table.insert) 

여러 개의 반환 값을 지원하기 위해 지불 한 가격을 가정합니다. 질문은 첫 번째 반환 값을 선택하는 표준 내장 메서드가 있습니까? 내가 select을 찾았을 때 정확히 그랬다고 생각했지만, 슬프게도 실제로는 을 모두 선택했습니다. 결과가 N 이후이므로이 시나리오에서는 도움이되지 않습니다.

지금 내가 정의 할 수 있습니다 알고 내 다음 자신의 select 같이

function select1(n, ...) 
    return arg[n] 
end 

table.insert(tbl, select1(1, string.gsub(input, "a", "b"))) 

을하지만 난이 일을 내장 방법을 기대할 수 있기 때문에 이것이 제대로 보이지 않습니다.

그래서 기본 제공 구성이 누락 되었습니까? 그렇지 않다면, 루아 개발자는 정확한 변수를 추출하거나 함수 select1을 작성하기 위해 별도의 변수를 사용하는 경향이 있습니까?

답변

11

당신은 괄호로 표현을 둘러싸고 수 있습니다

table.insert(tbl, (string.gsub(input, "a", "b"))) 

이것은 첫 번째 결과를 선택합니다.

n 번째 결과를 얻으려면, 당신은 select를 사용하고 괄호를 둘러싸고 수 있습니다

func1((select(n, func2()))) 
+0

고마워요! 나는 결국 _second_ 결과 만 원한 같은 상황에 처하게 될 것입니다. 그러면 어떤 옵션을 사용할 수 있습니까? –

+0

@romkyns : 답변 할 내 게시물이 업데이트되었습니다. 'select1' 함수가 더 읽기 쉽지만. – interjay

+0

나는 이것을 위해 더미를 사용하고 싶습니다. 즉,'_, _, _, fourthVal, _ = giveMeFive()'그 방법이 더 읽기 쉽습니다. – deorst

5

과 같이 괄호로 식을 퍼팅 :

table.insert(tbl, (string.gsub(input, "a", "b")))

하나 개의 반환 값을 강제 할 것이다. 또는 당신은 같이 둘 다 잡을 수 : 한 줄에

str,_ = string.gsub(input, "a", "b") 
table.insert(tbl, str) 
+0

여기에 두 개의 변수를 지정할 이유가 없습니다. 질문의 시작 부분에 표시된 것처럼 하나의 변수 만 지정하고 두 번째 값은 무시됩니다. – interjay

+1

select 외에도 여러 개의 반환 값을 처리하는 방법을 보여 주면 거대한 중첩 호출에서 반환 값 조정을 추적하기가 때로는 어렵습니다. – deorst

5

:

str,cnt = string.gsub(input, "a", "b") 
table.insert(tbl, str) 

또는 더 나은, 더미 캐치는 변수를 저장 ({ funct(args) })[n] 어떤을 선언하지 않고 n 번째 결과를 반환 명명 된 변수.