Dúvida sobre chamada em metatables em Lua!

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Dúvida sobre chamada em metatables em Lua!

Ícaro Pereira
Boa noite pessoal,

Se minha dúvida já apareceu por aqui, me desculpem. É o seguinte, possuo o seguinte código:

aTable = {}

for x=1,10,1 do
  aTable[x] = x
end

-- Metatable em Lua
mt = {
  __add = function(table1, table2)
    sumTable = {}

    for y=1,#table1,1 do
      if (table1[y] ~= nil) and (table2[y] ~= nil) then
        sumTable[y] = table1[y] + table2[y]
      else
        sumTable[y] = 0
      end
    end

    print("FUNCIONA!!")
    return sumTable
  end,

  __eq = function(table1, table2)
    print("FUNCIONA!!")
    return table1.value == table2.value
  end,

  __lt = function(table1, table2)
    return table1.value < table2.value
  end,

  __le = function(table1, table2)
    return table1.value <= table2.value
  end,
}

setmetatable(aTable, mt)

--print(aTable == aTable)

addTable = {}
if aTable == aTable then
  local bool = (aTable == aTable)
  addTable = aTable + aTable --and true or false
end

Nele, ao executar uma operação de adição "+", o print "print("FUNCIONA!!")" aparece, mas NÃO quando realizada uma operação de comparação de igualdade "==" como esperava que aconteceria acima...

Por quê? Eu tenho minhas suspeitas, mas gostaria de saber de vocês o que pensam, e conseguem ver, a respeito!

Obrigado!

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida sobre chamada em metatables em Lua!

Tomás Guisasola
Olá Ícaro

A explicação está no manual:

  • __eq: the equal (==) operation. Behavior similar to the addition operation, except that Lua will try a metamethod only when the values being compared are either both tables or both full userdata and they are not primitively equal. The result of the call is always converted to a boolean.

  • Se os valores forem primitivamente iguais, não há nenhuma necessidade de chamar um metamétodo.

    Abraço,
    Tomás


    2018-07-18 20:47 GMT-03:00 Ícaro Pereira <[hidden email]>:
    Boa noite pessoal,

    Se minha dúvida já apareceu por aqui, me desculpem. É o seguinte, possuo o seguinte código:

    aTable = {}

    for x=1,10,1 do
      aTable[x] = x
    end

    -- Metatable em Lua
    mt = {
      __add = function(table1, table2)
        sumTable = {}

        for y=1,#table1,1 do
          if (table1[y] ~= nil) and (table2[y] ~= nil) then
            sumTable[y] = table1[y] + table2[y]
          else
            sumTable[y] = 0
          end
        end

        print("FUNCIONA!!")
        return sumTable
      end,

      __eq = function(table1, table2)
        print("FUNCIONA!!")
        return table1.value == table2.value
      end,

      __lt = function(table1, table2)
        return table1.value < table2.value
      end,

      __le = function(table1, table2)
        return table1.value <= table2.value
      end,
    }

    setmetatable(aTable, mt)

    --print(aTable == aTable)

    addTable = {}
    if aTable == aTable then
      local bool = (aTable == aTable)
      addTable = aTable + aTable --and true or false
    end

    Nele, ao executar uma operação de adição "+", o print "print("FUNCIONA!!")" aparece, mas NÃO quando realizada uma operação de comparação de igualdade "==" como esperava que aconteceria acima...

    Por quê? Eu tenho minhas suspeitas, mas gostaria de saber de vocês o que pensam, e conseguem ver, a respeito!

    Obrigado!

    --
    Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
    Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
    Acesse esse grupo em https://groups.google.com/group/lua-br.
    Para mais opções, acesse https://groups.google.com/d/optout.

    --
    Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
    Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
    Acesse esse grupo em https://groups.google.com/group/lua-br.
    Para mais opções, acesse https://groups.google.com/d/optout.
    Reply | Threaded
    Open this post in threaded view
    |

    Re: Dúvida sobre chamada em metatables em Lua!

    Ícaro Pereira
    Obrigado, Tomás!

    Entendi e fiz a mudança no código para testes e consegui o resultado esperado!

    Até mais!

    Em 19 de julho de 2018 08:59, Tomás Guisasola <[hidden email]> escreveu:
    Olá Ícaro

    A explicação está no manual:

  • __eq: the equal (==) operation. Behavior similar to the addition operation, except that Lua will try a metamethod only when the values being compared are either both tables or both full userdata and they are not primitively equal. The result of the call is always converted to a boolean.

  • Se os valores forem primitivamente iguais, não há nenhuma necessidade de chamar um metamétodo.

    Abraço,
    Tomás


    2018-07-18 20:47 GMT-03:00 Ícaro Pereira <[hidden email]>:
    Boa noite pessoal,

    Se minha dúvida já apareceu por aqui, me desculpem. É o seguinte, possuo o seguinte código:

    aTable = {}

    for x=1,10,1 do
      aTable[x] = x
    end

    -- Metatable em Lua
    mt = {
      __add = function(table1, table2)
        sumTable = {}

        for y=1,#table1,1 do
          if (table1[y] ~= nil) and (table2[y] ~= nil) then
            sumTable[y] = table1[y] + table2[y]
          else
            sumTable[y] = 0
          end
        end

        print("FUNCIONA!!")
        return sumTable
      end,

      __eq = function(table1, table2)
        print("FUNCIONA!!")
        return table1.value == table2.value
      end,

      __lt = function(table1, table2)
        return table1.value < table2.value
      end,

      __le = function(table1, table2)
        return table1.value <= table2.value
      end,
    }

    setmetatable(aTable, mt)

    --print(aTable == aTable)

    addTable = {}
    if aTable == aTable then
      local bool = (aTable == aTable)
      addTable = aTable + aTable --and true or false
    end

    Nele, ao executar uma operação de adição "+", o print "print("FUNCIONA!!")" aparece, mas NÃO quando realizada uma operação de comparação de igualdade "==" como esperava que aconteceria acima...

    Por quê? Eu tenho minhas suspeitas, mas gostaria de saber de vocês o que pensam, e conseguem ver, a respeito!

    Obrigado!

    --
    Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
    Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
    Acesse esse grupo em https://groups.google.com/group/lua-br.
    Para mais opções, acesse https://groups.google.com/d/optout.

    --
    Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
    Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
    Acesse esse grupo em https://groups.google.com/group/lua-br.
    Para mais opções, acesse https://groups.google.com/d/optout.

    --
    Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
    Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
    Acesse esse grupo em https://groups.google.com/group/lua-br.
    Para mais opções, acesse https://groups.google.com/d/optout.