2013-11-22 30 views
4

我一直在學習在Lua元表,我想實現的範圍運營商在Ruby中,所以我用這個模型Lua的自定義數字級聯

debug.setmetatable(1, { 
    __concat = function(a, b) 
     if a > b then 
      error(table.concat({ 
       "attempt to create a range of values with a", 
       "minimum larger than the maximum" 
      }, " ")) 
     elseif a == b then 
      return a 
     else 
      return unpack((function(nStart,nEnd) 
       local nTable = {} 
       for it = nStart,nEnd do 
        table.insert(nTable, it) 
       end 
       return nTable 
      end)(a, b)) 
     end 
    end 
}) 

print(6 .. 6) 

但似乎它繼續使用缺省行爲。有什麼辦法讓這個工作?我意識到我可以創建一個函數來模擬行爲,並使用range(n,n2)或類似的名稱來調用它,但這會破壞目的。謝謝。

回答

4

請參閱Lua 5.2手冊的section 3.4.5

Lua中的字符串連接運算符用兩個點('..')表示。 如果兩個操作數都是字符串或數字,則根據§3.4.2中提到的規則將它們轉換爲字符串。否則,調用__concat metamethod(請參閱§2.4)。

如果要更改此行爲,請查看lvm.c,特別是luaV_concat函數。

+0

謝謝,我不認爲我可以輕鬆改變這種行爲? – Hal

+1

您必須在代碼生成器中查找基本工作,以便在拼接附近安排'tostring()'的效果。 Lua的消息來源評論得很好,但這不是微不足道的。第一步是消除自動轉換爲字符串,第二步是擴大使用'__concat'。 – RBerteig

+1

@Hal這是可行的,但至少需要知道一些C。請參閱我的答案附錄。當你可以做一個簡單的「範圍」功能時,它可能比它的價值更加努力。語法糖有其成本。 –