传播可选参数

Posted

技术标签:

【中文标题】传播可选参数【英文标题】:Propagating optional arguments 【发布时间】:2011-10-29 01:34:30 【问题描述】:

以下代码无法编译。

type A(?arg) =
  member __.Arg : string option = arg

type B(?arg) =
  inherit A(arg) //ERROR expected type string but has type 'a option

我认为这是因为必须提供选项基础类型的实例,并且编译器会根据语法处理传递 Some/None

假设我的假设已被正确假设,是否有解决方法?是否可以?

【问题讨论】:

【参考方案1】:

抱歉,必须先进行测试:看来您是对的 - 您必须执行“?”为你自己:

type A(arg : string option) =
  new (a) = new A(Some a)
  new () = new A(None)
  member __.Arg : string option = arg

type B(?arg) =
  inherit A(arg)

【讨论】:

这是可行的。谢谢。我会等着看是否有人可以建议如何使其工作,同时保留 A 上的可选参数。 再想一想,这意味着无法传播可选参数。您不能将具有相同可选参数的方法或派生类传递给构造函数——有点限制。每次都需要分支到正确的构造函数重载。 可能是一个错误 - 在类型 arg(带有?)中是字符串选项,但在 new 的定义中它是字符串 - 也许我们应该提交案例?【参考方案2】:

F# 规范 8.13.5 方法成员的可选参数

调用者可以使用以下技术为可选参数指定值:

按名称,例如 arg2 = 1。 通过按名称传播现有的可选值,例如 ?arg2=None 或 ?arg2=Some(3) 或 ?arg2=arg2。这在构建一种将可选参数传递给另一种方法时很有用。

使用按位置匹配的普通、未命名的参数。

type A(?arg) =
    member __.Arg : string option = arg

type B(?arg) =
    inherit A(?arg = arg) 

printfn "1. %A" (B()).Arg // None
printfn "2. %A" (B("1")).Arg // Some "1"

printfn "3. %A" (A()).Arg // None
printfn "4. %A" (A("1")).Arg // Some "1"

【讨论】:

好的。你已经阅读了太多的规范。 :-) 为什么会这样? 没关系。我在规范中找到了它。我真的要读一段时间了。 有趣的是,两个月前我有一个类似的问题 (***.com/questions/6353897/…),但没有人能给我正确的答案。感谢 desco 的回答!【参考方案3】:

F# 会将 ? 标记的参数转换为可选值。 提供一个参数会给出一个 Some-value,而不提供它会给出一个 None-value。 可选参数和命名参数的组合让您拥有极大的灵活性。

也可以在这里查看我的回答https://***.com/a/66043023/15143713 /JEE,夏普#Soft

【讨论】:

问题是关于如何将可选参数传播到基类。您只是指出了问题中已经说明的一些内容(翻译为 Some/None)。 请看我的链接。我确实解释了如何在那里传播可选参数。我不想重复我的答案两次。 /JEE - 锋利和柔软

以上是关于传播可选参数的主要内容,如果未能解决你的问题,请参考以下文章

Dart语法之可选参数

C#中可选参数和具名参数的使用

Dart 知识点:可选参数必需参数

面试突击13:方法优先调用可选参数还是固定参数?

是否有必要在将可选参数传递给另一个可选参数之前检查它?

命名参数和可选参数,以及 WCF