【问题标题】:Lua, setting default function parameter values. This can't be wrong?Lua,设置默认函数参数值。这不会错吧?
【发布时间】:2019-01-18 07:19:23
【问题描述】:

Eclipse 告诉我 ')' 应该在 '=' 附近,但这肯定不对吗?这是我的代码:

Animator = Class{}

function Animator:init(statictilesize = true)

    self.isTileSizeStatic = statictilesize

end

我很困惑。不过,我只使用 Lua 一个月,我更像是 C++ / C# / Python 人。也许我错过了一些东西。

【问题讨论】:

    标签: function parameters lua default-value expected-exception


    【解决方案1】:

    通常似乎要做的是像平常一样定义您的函数,如果未设置您希望成为可选的变量,您稍后设置它们,并重新定义您的函数签名以查找表:

    Animator = Class{}
    
    function Animator:init(args)
        self.isTileSizeStatic = args.statictilesize ~= false
    end
    

    稍后你用这种形式的语法调用这个函数:

    Animator.init{statictilesize = false}
    

    nilfalse 都是 Lua 中的“假”条件。 Lua 中的所有其他条件都是真实的,包括0''。因此,为了获得当 statictilesize 未设置时默认为真条件的功能,您必须检查其不等式是否为假,因为其他所有内容都将为真(包括 nil,因为 nil 不是 false )。

    请注意,这会将您的参数隐式转换为布尔值

    它与 Python 有很大不同。

    更多详情请看这里:

    https://www.lua.org/pil/5.3.html

    此外,如果您希望 false 成为传递给函数的可接受参数集的一部分(或者您只是不希望参数隐式转换为布尔值),您可以使用以下语法:

    function Animator:init(args)
        if args.statictilesize ~= nil then self.isTileSizeStatic = args.statictilesize else self.isTileSizeStatic = true end
    end
    

    【讨论】:

    • 谢谢,这很有帮助。抱歉,我没有查看 Lua Docs,问题是我不知道要搜索的术语。我从未接受过正式的编程教育,所以我真的不知道所有这些东西都叫什么,这就是为什么我总是在尝试谷歌/搜索解决方案时感到非常沮丧。我知道我想要完成什么的想法,但不知道这些事情叫什么。我想接受正规教育,但我负担不起。我身无分文,身无分文,正拼命学习这些东西,这样我就可以重返工作岗位,过上更好的生活。
    • 完全没问题;这就是为什么有这样的社区可以帮助您学习的原因。如果您负担得起,并且您对 Lua 感兴趣,我强烈建议您从 Amazon 或类似网站获取官方阅读材料。这是一本很好的读物,可以深入了解为什么事情是 Lua 中的样子。
    • args.statictilesize or true 不适用于布尔值。如果statictilesize == false 怎么办?
    • @EgorSkriptunoff 正确,我的错误,更新了答案。
    • 一般提示:查看 StackOverflow 的标签 wiki 以获取指向主要参考资料和学习帮助的链接,例如 Lua。您可能会惊讶地发现许多主要参考资料,例如参考手册和规范,对于许多学习者来说都很容易获得。
    【解决方案2】:

    好吧,显然我是个 Lua Noob / 被宠坏的 C++ Python 家伙。

    Lua 不允许这样做。相反,在 init 或构造函数中,放置:

    argument = argument or defaultValue
    

    如,

    function Animator:init(statictilesize)
        statictilesize = statictilesize or true
        self.isTileSizeStatic = statictilesize
        -- Yikes
    end
    

    编辑:我找到了一个更稳定的解决方案,因为在第一个之后我需要更多参数。

    function Animator:init(booleanstatictilesize, totalanimationstates, totalanimationframes)
    
        if booleanstatictilesize ~= false then
          self.isTileSizeStatic = true
        else
          self.isTileSizeStatic = false
        end
    
    end
    

    某种被破解的类型转换/检查。我可能是错的,我在这一切都是菜鸟。我从未接受过正规的编程教育。我可能听起来像个白痴。

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 2013-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      相关资源
      最近更新 更多