Я как парам, и настройка объема? - PullRequest
1 голос
/ 10 февраля 2020

Может кто-нибудь, пожалуйста, помогите мне с этим.

local function TestPrice()
  local obj1 = require("myObj")
  local obj2 = require("myObj")

  obj1:setPrice(30)
  obj2:setPrice(40)
  print(obj1.price)    -- this prints '40'. Setting price on obj2 changes the price in obj1
end

и

-- myObj.lua
local M = {
price = -1;}

local function _setPrice(self, newprice)
  self.price = newprice
  -- todo other stuff
end

M.setPrice = _setPrice

return M

Я думал, что установив self в качестве параметра, он устанавливает область действия. Почему вызов этой функции в obj2 обновляет значение obj1?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Вам нужна функция для создания нового объекта

-- myObj.lua
local M = {}

local function _setPrice(self, newprice)
  self.price = newprice
  -- todo other stuff
end

M.setPrice = _setPrice
M.__index = M

local function create_new_obj()
   local obj = {price = -1}
   setmetatable(obj, M)
   return obj
end

return create_new_obj


-- main.lua
local function TestPrice()
  local obj1 = require("myObj")()
  local obj2 = require("myObj")()

  obj1:setPrice(30)
  obj2:setPrice(40)
  print(obj1.price, obj2.price)
end

TestPrice()
1 голос
/ 10 февраля 2020

В вашем коде require загружается один раз, а второй require дает вам тот же объект . Вы должны реализовать какой-то метод копирования.

-- myObj.lua
local M = {
price = -1;}

local function _setPrice(self, newprice)
  self.price = newprice
  -- todo other stuff
end

function M:copy()
  return {["price"] = self.price, ["setPrice"]=_setPrice, ["copy"] = self.copy}
end

M.setPrice = _setPrice

return M
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...