【问题标题】:How to construct a function with a default argument如何使用默认参数构造函数
【发布时间】:2021-04-13 12:42:55
【问题描述】:

为了创建一个带有默认参数的函数,我尝试了这个:

f: function [a b] [either unset? :b [a + 1] [a + b]]
f 5
f 3 5

然后我收到这条消息*** Script Error: f is missing its b argument
那么,我该怎么办?

【问题讨论】:

    标签: rebol red


    【解决方案1】:

    实现一些内置函数使用的可变参数函数有一个技巧,最值得注意的是help

    >> ? help
    ...
    ARGUMENTS:
         'word        [any-type!]
    

    将您的论点指定为引用并属于any-type! 排版。或者,列出允许的类型并在其中包含unset!

    >> foo: func [a 'b [unset! integer!]][a + do pick [1 b] unset? :b]
    == func [a 'b [unset! integer!]][a + do pick [1 b] unset? :b]
    >> foo 5
    == 6
    >> foo 3 5
    == 8
    

    然而,这是有代价的:

    • 可选参数必须在强制参数之后连续出现。
    • 脚本中的所有此类函数调用现在都需要用括号括起来,否则解释器无法猜测可变参数表达式的结束位置。
    • 你失去了类型检查的好处,因为any-type! 接受任何参数;参数前面的' 还强制执行specific 语义,这使得此类可变参数函数更加麻烦。
    • 您的代码变得单调:解决可选参数需求的传统方法是通过改进。可变参数函数通常使用单个 block! 参数实现,甚至可能是方言。

    这种方法仅适用于面向用户的多态函数,旨在从命令行提示符(例如 help)或任何其他类型的为类型表达式提供清晰边界的界面(例如 end行,特殊终止符号),即使这样,可选参数的数量也保持在最低限度。

    【讨论】:

    • 对这个项目的非常详细的描述!谢谢!还有一个很有趣的技巧——pick [1 b] unset? :b,我只是发现pickindex可以是logic!,但是在哪里可以找到如何使用呢?
    • @lyl 它是三元运算符的一种形式。表达式根据其逻辑值选择第一个或第二个值。与either 相同,但不评估分支。
    【解决方案2】:

    您可以使用细化。见:http://helpin.red/Functions.html

    例如:

    >> increase: function [a /add b] [either none? b [a + 1] [a + b]]
    == func [a /add b][either none? b [a + 1] [a + b]]
    >> increase 3
    == 4
    >> increase/add 3 5
    == 8
    

    【讨论】:

    • 谢谢。是的,细化是一种解决方案。但我认为这偏离了函数中默认参数的最初想法。
    • 恐怕这在 Red 中是不可能的。您也可以尝试使用 block 作为参数,并且 block 可以包含任意数量的元素。但这只是一种解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多