Lua 面试题 目录

Lua 中 __unm metamethod 的作用是什么?

推荐答案

在 Lua 中,__unm 元方法用于定义一元减号操作符(即取负操作)的行为。当对一个表或用户数据类型的值使用一元减号操作符时,Lua 会查找该值的 __unm 元方法。如果找到,Lua 会调用该元方法来执行取负操作。

本题详细解读

1. __unm 元方法的基本用法

__unm 元方法通常用于自定义类型的取负操作。例如,假设你有一个表示复数的表,你可以通过定义 __unm 元方法来实现复数的取负操作。

-- -------------------- ---- -------
------- - -
    ---- - --
    ---- - -
-

---------- - -
    ----- - -----------
        ------ ----- - -------- ---- - --------
    ---
-

--------------------- -----------

----------- - --------
----------------------- -----------------  -- --- -- --

在这个例子中,__unm 元方法被定义为一个函数,它接受一个复数表 c 并返回一个新的复数表,其实部和虚部都是原复数的相反数。

2. __unm 元方法的调用时机

当你对一个表或用户数据类型的值使用一元减号操作符时,Lua 会检查该值的元表中是否有 __unm 元方法。如果有,Lua 会调用该元方法,并将该值作为参数传递给元方法。

-- -------------------- ---- -------
----- - - ------ - ---
----- -- - -
    ----- - ------------
        ------ ------ - ----------
    ---
-

--------------- ---

----- ------ - --
-------------------  -- --- ---

在这个例子中,-t 触发了 __unm 元方法的调用,最终返回了一个新的表,其 value 字段是原表 value 字段的相反数。

3. __unm 元方法的注意事项

  • __unm 元方法只能用于表或用户数据类型。对于 Lua 的基本类型(如数字、字符串等),Lua 已经内置了一元减号操作符的行为。
  • 如果元表中没有定义 __unm 元方法,尝试对表或用户数据类型使用一元减号操作符会导致错误。

因此,在自定义类型中,如果你希望支持一元减号操作符,必须定义 __unm 元方法。

纠错
反馈