1. 程式人生 > >為lua table防寫變成只讀

為lua table防寫變成只讀

local function readOnly(t)
    local newTable = {}
    local mt = {
       __index=t,
       __newindex=function(t, k, v)
              error("read only!");
         end
    }
    setmetatable(newTable, mt);
    return newTable
end

local tbl = readOnly({"A", "c"})
通過readOnly返回的表是無法進行賦值操作的。
</pre><pre name="code" class="plain">因為readOnly會建立一個新的空table,並把傳進去的table 作為_index的元方法。
元表裡還增加了一個_newindex,用來阻止不存在欄位的賦值操作。
通過readOnly返回的表已經不是原來的tale了,只是一個空的table,但是它被設定了一個新的元表。
例如 tbl[1] = "B",對tbl的第一個元素進行賦值操作,實際上tbl是一個空的table 根本不存在 1 這個欄位,所以會呼叫_newindex的元方法 去對table進行更新。由於重寫了_newindex的元方法,所以會觸發報錯資訊。
如果只是呼叫tbl,而不去對其進行賦值。例如print(tbl[1]),則能正常輸出“A”,因為tbl元表裡有_index元方法,雖然tbl中不存在 1 這個欄位,但可以通過_index找到這個欄位。
</pre><pre name="code" class="plain">注:rawget(table, key) 可以忽略元表的_index功能(就是不通過_index的元方法進行查詢) 取出table中key欄位的值
   rawest(table, key, value) 可以忽略元表的_newindex功能(就是不通過_newindex的元方法對錶的不存在區域值進行更新)直接更新表key欄位區域的值。

相關推薦

lua table變成只讀

local function readOnly(t) local newTable = {} local mt = { __index=t, __newin

LUA table中函數的調用

func tro 方式 聲明 隱藏 img spa src pan 1 lua中函數作為表中元素時有三種定義方式 采用‘:’來定義,實際上隱藏了一個形參的聲明,這個形參會截獲調用函數時的第一個實參並把它賦值給self 2 調用方式,點號和冒號 functb:hello1(

lua table引用問題

引用 lua tables 一,基礎1,在lua中,table只是傳遞引用,所以不能用簡單的 "=" 來copy兩個表,並試圖修改一個表中的值。tb = {} tb.a = 11 tb.b = 22 tb_ref = tb function p(tip) print("------------

什麽要技術博

.com 記憶 mage 馬斯洛 visual 我們 必須 準備 也有 認知 從小學到大學,我的學習方式都是“聽課 + 做筆記 + 讀書”。整個過程類似於web1.0:我是一個客戶端,從服務器(講師或者書籍)那裏“獲取”信息,而基本不用產出什麽。整個學習的過程蝸牛慢,一

cocos2d-x-lua基礎系列教程六(lua-table增刪改查)

{} cat ng-click 位置 rip 腳本 ack content -c lua-table庫 1。插入 table.insert () --假設沒有設定位置。默認last位置 樣例: myTable = {

解決linux下U盤變成只讀模式

u盤 折騰 windows linux下 寫入 版本 插入 文件 項目 在最近的一個項目裏,需要將linux下的些文件拷貝出來。插入U盤後,發現是只讀模式。 U盤可以寫出,不能寫入。 折騰了一翻: 最後這樣解決的: 將U盤插入到windows下 執行 chkdsk g: /

什麽要《OpenCV Android 開發實戰》這本書

基礎算法 map 完整 發展 十年 程序員 核心 智能 完成 我為什麽要寫《OpenCV Android 開發實戰》這本書 2015年我出版了個人第一本關於圖像處理方面的書籍《Java圖像處理-編程技巧與應用實踐》,這本書主要是從理論與編碼上面詳細闡述了圖像處理基礎算法以

了300多篇文章了,說說我什麽堅持博客

架構 比較 但我 決定 在哪裏 shell https 系列 水平 今天下午突然看到: 原來,我已經寫了300多篇博客了。現在想想,我收獲了很多,也失去了很多。現在我想寫一篇文章,感想類的文章,也是這麽久以來、這麽多文章中唯一的一篇非技術類文章。 開寫之前,先把我寫的3大

網站建設筆記:什麽中小學生讀後感都上百家筆記網?(圖)

信息 推薦 pan left 就是 人工 ali http 通過 網站建設筆記:為什麽中小學生寫讀後感都上百家筆記網?(圖)一到寒暑假,所有的學生們都萬的不亦樂乎,但是到了寒暑假尾期,大家又要開始寫作業了,那麽,為什麽百家筆記網得到了廣大學生們的喜愛,並且寫讀後感和讀書筆記

阮一峰:什麽要博客(轉)

today html footer pac 訪問 2018年 網站流量 ip訪問 組態 2010年4月,我與百姓網CEO王建碩有過一次對話。我們談到了為什麽寫博客。 ? 阮:建碩,我知道你有兩個博客,一個是英文的,另一個是中文的。但是,你更新英文博客的頻率,遠遠高於

轉換sql文件的create table語句drop table語句

void sql文件 iter test imp rgs pan 轉換 ont 1 package com.csii.pweb.query.action; 2 3 import java.io.BufferedReader; 4 import java.io.F

最新用WPF觸摸屏了一個手程序,雙格輸入的

nload size alt wpf 一個 ast 點擊 fill fonts 原文:最新用WPF為觸摸屏寫了一個手寫程序,雙格輸入的 雙格輸入可以提高手寫速度,當前字寫完以後

已知順序表L中的元素int,請一時間複雜度O(n)、空間複雜度O(1)的程式,將L中的奇數元素排在前面,偶數元素排在後面

Status exchangeEvenOddNumbers(SeqList &S){ int j = 0,k = 0; for(int i = 0;i<=S.last;i++){ if(S.elem[i]%2 == 1){ k

lua table string互轉

function serialize(obj) local lua = “” local t = type(obj) if t == “number” then lua = lua .. obj elseif t == “boolean” then lua = lua .. to

chkdsk /f P 很強大,幫我解決了硬碟的問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

關於記憶體和IRQL

摘自胡文亮win64驅動程式設計基礎 在核心裡想要寫入“別人的” 記憶體( 一般指 NTOS 等系統模組的記憶體空間),還有另外的規矩,這裡又涉及到另外兩個概念: IRQL 和記憶體保護。 IRQL 成為中斷請求級別,從 0~31 共32 個級別; 記憶體保護可以開啟和關閉,

作為一個程序員的我什麽要博客

重點 沒有 說了 item 一段 同事 希望 blank 現在 作為一個程序員的我,為什麽要來寫博客呢? 有人可能還不知道博客是什麽,我首先來介紹一下博客吧。 博客,僅音譯,英文名為Blogger,它的正式名稱為網絡日記。是使用特定的軟件,在網絡上出版、發表和張貼個人文章的

bug解決-核心C庫(FORTIFY: write: prevented read past end of buffer)

備註:展訊平臺 1、問題描述   昨天同事問我一個問題,報的是一個native crash問題,問題log如下所示: 01-05 00:01:12.600 2794 6237 F libc : Fatal signal 6 (SIGABRT), code -6 in

MT7628/MT7688 SPI Flash

MT7628 # spi id SPI_REG_OPCODE=0x9f _device id: c2 20 18 0 0 MT7628 # spi sr read SPI_REG_OPCODE=0x5 sr=0x0 MT7628 # spi sr write bc trying write sr

lua編寫C庫

本文參考 https://blog.csdn.net/zhang197093/article/details/76400871 我一直是喜歡將各種庫揉成一團放在一個可執行檔案裡。一個sh編譯出來。 但是我看到朋友都喜歡將不同功能的庫分別編譯成so,在lua中require。 我也