为什么Swift使用此函数表示法:
func greet(person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
我不明白为什么它使用小箭头->
表示法来指定返回类型。 func identifier() -> Type
代替更明智的内容,例如Type identifier()
。
我在Haskell中看到了类似的符号,但在Haskell中它对我有意义,因为Haskell使用curried函数,因此箭头表示函数currying。在快速,它似乎冗长和多余。
这种设计选择背后的原因是什么?
请客观地回答这个问题。这不是基于意见的,因为我不是在征求意见,我只是想知道设计选择背后的原因。
答案 0 :(得分:2)
这个问题很可能因为基于意见而被关闭99%,但我会尝试对可能促使这种选择的动机进行客观的尝试。
大多数C类语言的格式都是Type identifier(params)
。不可否认,这是源于C的原创设计。 C ++,Java,C#都遵循这种风格。
这种风格对于非平凡类型存在重大问题,因为它很难在没有首先阅读类型并解析它的情况下挑选方法名称。考虑一下这种非常典型的Java方法:
...
public static final Map<String, Array<MyGenericType<Foo, Bar>>> myMethodName(Type param) { ... }
...
方法名称myMethodName
位于屏幕的中间位置(假设您遵循120字符的统治代码标准,而不是80字符代码标准)。这真的很傻。
样式指南已经提到了这一点,对于许多C语言,建议将名称放在新行上,包括前一行的所有类型信息,访问说明符等。这在C ++中尤为普遍。
从C ++中的Boost
库中考虑这个真实的示例。
template <class A1, class A2, class A3, class A4, class A5, class A6>
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
return result_type();
}
很多人会建议像这样写:
template <class A1, class A2, class A3, class A4, class A5, class A6>
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type
auto make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
return result_type();
}
但无论如何,C ++合作实现了这种疯狂,现在允许将其写成:
template <class A1, class A2, class A3, class A4, class A5, class A6>
make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&) -> inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
return result_type();
}