第一百三十八章 真正深入了解NBT-4
在前三章,我已經(jīng)講完了字符和數(shù)值類型的數(shù)據(jù)類型,現(xiàn)在我們再來看看下表:
[字符]
字符串(String)
[數(shù)值]
{整形}
字節(jié)型(Byte:B)
短整型(Short:S)
整型(Int:I)
長整型(Long:L)
{浮點型(小數(shù))}
單精度浮點型(Float:F)
雙精度浮點型(Double:D)
[數(shù)據(jù)]
復合標簽(Compound)
列表(List)
[數(shù)組]
字節(jié)型數(shù)組(Byte Array:[B])
整型數(shù)組(Int Array:[I])
長整型數(shù)組(Long Array:[L])
按照順序,接下來就應該到了[數(shù)據(jù)]這個數(shù)據(jù)類型了。而里面的這兩個:
復合標簽(Compound)
列表(List)
都是我們已經(jīng)非常熟悉的數(shù)據(jù)類型了,因為這兩個數(shù)據(jù)類型特別常見。但神奇的是,它們也經(jīng)常被忽略。
為何?
因為它們說到底,就是兩種符號:
{}——復合標簽(Compound)
[]——列表(List)
數(shù)據(jù)可以套娃在它們里面,而多個數(shù)據(jù)需要用英文半角逗號分割。
只不過,它們兩的差別,是不是只有符號和名字的差別呢?
當然不是。
實際上,它們兩絕對不是你想的那么簡單。
首先,它們兩的作用準確的來說是:
復合標簽(Compound):包含一段獨立的NBT標簽。如{killname:“MNG“,killtime:6000}
列表(List):存儲多個類型相同的數(shù)據(jù)。如{time:[2020,12,21]}。
看起來似乎也沒什么不同的地方對吧?
我們知道,一個NBT最外層就是由{}來包裹著的,而里面存儲著各個標簽,每個標簽用英文半角逗號分割。而復合標簽也是這樣子的,所以,復合標簽的作用才這樣說:包含一段獨立的NBT標簽。
如果你看不懂,那也沒關系,我們可以通過名字理解?!皬秃蠘撕灐边@個名字是由“復合”和“標簽”。
“標簽”這個詞的意思相信大家都知道。那么“復合”又是什么意思呢?
答案很簡單:指物體等因某種原因而結合起來
理解了“復合”的意思,再來看看“復合標簽”,我們很快就可以理解這個詞:
指多個標簽結合起來
不得不說,漢語真是博大精深。那么接下來,我們再來看看列表。
上面已經(jīng)說了,列表的作用就是:存儲多個類型相同的數(shù)據(jù)。翻譯這個為人話就是:把多個同樣類型的東西統(tǒng)一存儲起來。
這就說明了什么?這就說明了列表的“[]”包含的只能是指定類型的數(shù)據(jù),實際上還屬于值的范圍。而{}包含的就不是指定類型的數(shù)據(jù)了,而是標簽!這就是兩種數(shù)據(jù)類型的不同之處。
所以在列表中才不用寫數(shù)據(jù)類型,因為大家都一樣。這就像是乘法分配律,把公因數(shù)都提取出來,進行簡化算式。
現(xiàn)在搞懂這兩個的區(qū)別了吧?我相信你已經(jīng)搞懂了。
如果你還不懂,看看上面的兩個例子。
好了,相信各位都已經(jīng)準備好了,那么接下來我們就進入下一階段。
我們知道,列表可以存儲多個類型相同的數(shù)據(jù)。那么當數(shù)據(jù)是復合標簽時,該怎么辦?
很簡單,其實這種情況我們已經(jīng)遇見過很多次了,比如我們最了解的Enchantments(/?n?t??ntm?nts/)標簽,我們都知道它的格式是這樣的:
{Enchantments:[{id:<魔咒id:String字符串>,lvl:<級數(shù):Int整形>}]}
可以發(fā)現(xiàn),這里就出現(xiàn)了[{}]這種組合。如果你細心觀察,你就會發(fā)現(xiàn):列表里每項復合標簽里的標簽名稱、格式都是完全一樣的。
這說明了什么?這就說明了如果列表的項是復合標簽,那么每個復合標簽里的格式、標簽名稱都是完全一樣的。
這很簡單對吧?
實際上到此為止,關于復合標簽和列表這兩項數(shù)據(jù)類型就已經(jīng)講完了。
........
但此時,仍然有一個未解之謎:
我們知道,列表的項可以有很多。那么列表的項數(shù)到底有沒有上限呢?
答案很簡單:在沒有明確規(guī)定列表的格式時,列表的項數(shù)理論上是無上限的。(明確規(guī)定列表格式的,比如在第一百三十二章講到的ArmorDropChances)
只不過在實際操作過程中,列表還是有上限的:硬件。
嗯.......這可真是對了那句話:硬件決定上限,軟件決定下限。
OK那么這一章就到這里了,我們下一章再見。