luaオブジェクト向けがどのように実現されるか

4859 ワード

lua言語には真の意味のオブジェクト向けではなく,関数シミュレーションによるオブジェクト向けである.どうやって進化したのか見てみましょう.
1.基本的な関数
People = {}

function People.sayHi()
  print("Hi, nice to meet you.")
end

People.sayHi();

People.sayHi = function()
  print("Hi, nice to meet you from func")
 end
 
People.sayHi();

--              
--result:
--Hi, nice to meet you.
--Hi, nice to meet you from func

2.まずtableの遍歴について、(luaではオブジェクトが実際にtable,オブジェクト.フィールド名==table[フィールド名]であるため,tableの遍歴について述べる必要がある)pairs関数を用いる
local arr = {"one", "two", ["one"] = "xxx", ["two"] = "yyy"}

local intValue = 3

for key, val in pairs(arr) do
  print("value of "..key.." is "..val)
end
--  table     ,  “  ”  
--value of 1 is one
--value of 2 is two
--value of one is xxx
--value of two is yyy


for key, val in ipairs(arr) do --           ipairs 
  print("value of "..key.." is "..val)
end
--   table “  ”  
--value of 1 is one
--value of 2 is two

for key, val in pairs(intValue) do
  print("value of "..key.." is "..val)
end

--   table     pairs         
-- bad argument #1 to 'pairs' (table expected, got number)

3.元の姿は実はnewには関係なく、newとはずいぶん違うので、信じないで見てください.
--     
function clone(origin)
  local dest = {}
  for key, value in pairs(origin) do
  	dest[key] = value
  end  
  return dest;	
end

--   
People = {}

People.sayHi = function()
  print("Hi, nice to meet you from func")
 end
 

--      ,        
p = clone(People) --        ,         new Peopel()       , lua         
p.sayHi();

--result:       ,        ,           。。。
--Hi, nice to meet you from func
--Hi, nice to meet you from func

4.模様を変えて、私たちはclone関数をこっそりnewという名前の関数にカプセル化して、最後の2行のコード(p=clone(People)から始まるコードを次のように置き換えます)(このステップが肝心です)を修正します.
function People.new()
   self = clone(People)   
   return self
 end
 

--      ,        
--p = clone(People)
--       new   

p = People.new()
p.sayHi();

ははは、new相手ができるかどうか.あら、本当にベストを着ているのがわかりませんね..(この文章を読んでいない限り、はは、でたらめを言って、牛たちはとっくに文章を持っています)
5.オブジェクトにパラメータ付きnew(javaのパラメータ付き構造関数、例えばnew String(「parameter」)をサポートさせ、People全体の「クラス」を書き換えたい.
--   
People = {}

People.sayHi = function(self)
  print("Hi, nice to meet you from func, My name is "..self._name) --   _name      
  --      ,attempt to index local 'self' (a nil value)
  --         p.sayHi()
 end
 
 
 function People.new(name)
   self = clone(People)   
   
   self._name = name --        _name  
   return self
 end
 

--      ,        
--p = clone(People)
--       new   

p = People.new("stephen")
p.sayHi();


--result:
--attempt to index local 'self' (a nil value)

ああ、パラメータを作ったら間違っています.空のポインタ、仕方がありません.ポインタを入れるしかありません.
p.sayHi()  - - -->p.sayHi(p)
--結果は正しかった
- -Hi, nice to meet you from func, My name is stephen
はははは終わって負けた.
でも
p.sayHi(p)という書き方は醜いでしょう.java c++プログラマーはこんな見苦しい書き方を軽蔑します.はい、luaは私たちを美化してくれます.
p.sayHi(p) - - -> p:sayHi()
--結果は正しい
- -Hi, nice to meet you from func, My name is stephen
点(.)の代わりにコロン(:)を使用します.luaは自動的に変形し、ポイント番号の前のオブジェクトをパラメータに渡します.
例えばlilei:setGirlFriend("hanmeimei")--->lilei.setGirlFriend(lilei, "hanmeimei")
カーブが曲がり,luaでは関数でオブジェクト向けを実現した.
[原句]など、継承はどうやって実現するのか.
ははは、次のコードをデモします.
--     
function clone(origin)
  local dest = {}
  for key, value in pairs(origin) do
  	dest[key] = value
  end  
  return dest;	
end

--   
People = {}

People.sayHi = function(self) --      
  print("Hi, nice to meet you from func, My name is "..self._name) --   _name      
  --      ,attempt to index local 'self' (a nil value)
  --         p.sayHi()
 end
 
People.eat = function()
  print("Different people eat different thing")
end
 
 
People.new = function(name)
   self = clone(People)   
   
   self._name = name --        _name  
   return self
 end
 
 
function copy(dest, tab)
  for key, val in pairs(tab) do
  	dest[key] = val
  end

end

--     
Chinese = {}

Chinese.new = function(name, hukou)
  self = People.new(name);    --new         
  self._hukou = hukou
  
  copy(self, Chinese)  --                self  
  
  return self
end

Chinese.eat = function() --       
  print("Eat mantou")
end

Chinese.buyHouse = function()
  print("Can not afford at all")
end

lisi = Chinese.new("lisi", "hebei")

print(lisi._name.." is from "..lisi._hukou) --            

lisi:sayHi() --       
lisi:eat() --       
lisi:buyHouse() --        

--result
--lisi is from hebei
--Hi, nice to meet you from func, My name is lisi
--Eat mantou
--Can not afford at all

引き継ぎも終わり、、仕事を終える