lua函數傳入參數問題


寫在前面

使用lua時,會發現這樣一個情況

print("aa") -- 輸出aa
print('aa') -- 輸出aa
print "aa"  -- 輸出aa
print 'aa'  -- 輸出aa
print {}    -- 輸出某地址。

可以發現lua的寫法十分靈活,為什么能這么些呢,lua又是怎么解析這些句子的呢,接下來來分析下Lua源代碼(基於5.3.5)

解析過程

//parser.c
static void suffixedexp (LexState *ls, expdesc *v) {
  /* suffixedexp ->
       primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */
  FuncState *fs = ls->fs;
  int line = ls->linenumber;
  primaryexp(ls, v);
    ...
}

1.首先我們進入suffixedexp后再進入primaryexp

 

static void primaryexp (LexState *ls, expdesc *v) {
  /* primaryexp -> NAME | '(' expr ')' */
  switch (ls->t.token) {
    ...
    case TK_NAME: {
      singlevar(ls, v);
      return;
    }
    ...
  }
}

2.我們獲取了函數的名字然后在suffixedexp過程中 有

 

static void suffixedexp (LexState *ls, expdesc *v) {
  ...
  for (;;) {
    switch (ls->t.token) {
      ...
      case '(': case TK_STRING: case '{': {  /* funcargs */
        luaK_exp2nextreg(fs, v);
        funcargs(ls, v, line);
        break;
      }
      ...
    }
  }

3.可以得到如下結論,lua的函數接受三種寫法傳入參數,且能起到相同的作用

1. (arg1, arg2, arg3 ... )

2. "argv" 'argv'

3. {}

后兩種類型的參數數量只能為1,而且類型限定為字符串或者表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM