-->

斯卡拉 - 缀VS点符号(Scala - infix vs dot notation)

2019-06-23 18:58发布

是否有一个比其他最佳实践? 我一直Odersky的,等看完书斯卡拉。 并且好像被用于很多的类别的API函数中缀,而点被保留用于程序员定义的函数。

Answer 1:

我个人没有这方面的任何硬性规定,但我倾向于使用中缀表示法只能用象征性的方法名,并点符号的字母数字的。

中缀表示法使得繁琐以后修改代码。 这里有些例子。

想象一下,你有这行代码:

xs filter { f } map { g }

假设在时间,你需要添加一些后一点toList月底。 你说得那么:

xs filter { f } map { g } toList

这可能会导致分号推理的问题。 为了避免这些问题,你要么把分号结束处,或换上新线。 这两个选项是丑陋的,在我看来。 为了避免这么多废话,我宁愿去与xs.filter(f).map(g) 它总是容易与这种语法重构。

又如:说我有在我的代码如下:

if(foo contains bar) { ..

我说,我需要否定的条件。 如果我修改如下:

if(!foo contains bar) { ..

游民。 这被解析为(!foo).contains(bar) 。 不是我们想要的。

或者,假设你需要另外添加新条件,并对其进行修改,以便:

if(foo contains bar && cond) { ..

另一个令人失望。 这被解析为foo.contains(bar.&&(cond)) 不是我们想要的,一次。

当然,你可以添加一堆左右括号,但与点符号相比,这将是丑陋的,难以阅读/编辑。

现在,所有上面我所说的适用于象征性的方法名了。 然而,随着点语法使用时,象征性的方法看起来不自然,所以我更喜欢他们的缀语法。


有一个例外,上述指南:内部DSL。 它们通常小心雕琢,以免引起写在他们的文档/例子规定(通常使用中缀表示法)的方式时解析问题。



Answer 2:

这是个人喜好的问题。 你决定使用一种风格或其他应基于什么使你的代码最可读的。

但请注意,离开断点和括号的能力仅限于一定的句法结构,所以有时你不得不退回到使用它们。



Answer 3:

这是一个很好的风格指南官方网站斯卡拉文档描述了点符号的正确使用中缀表示法英寸

后缀符号:

names.toList
// is the same as
names toList // Unsafe, don't use!

元数的1:

// right!
names foreach (n => println(n))
names mkString ","
optStr getOrElse "<empty>"
// wrong!
javaList add item

高阶函数:

// wrong!
names.map (_.toUpperCase).filter (_.length > 5)
// right!
names map (_.toUpperCase) filter (_.length > 5)

象征性的方法/操作员:

// right!
"daniel" + " " + "Spiewak"
// wrong!
"daniel"+" "+"spiewak"


Answer 4:

我发现,使用中缀表示法map作品很好,当我创建一个与库笛卡尔。 例如:

(fetchIt(1) |@| fetchIt(2) |@| fetchIt(3)).map(MyCaseClass)

你可以摆脱像这样周围的括号:

fetchIt(1) |@| fetchIt(2) |@| fetchIf(3) map MyCaseClass

而在我看来,第二个变体读取更好。 口味的问题,我想。 只是想补充我的两分钱的价值。

以上作品,因为| 在 “| @ |” 的优先级高于m在“地图”。 阅读斯卡拉郎规范的这一部分,了解更多详细信息:

如果一个表达式有几个缀操作,然后以更高的优先级运营商比低优先级运营商结合更加紧密。

http://scala-lang.org/files/archive/spec/2.12/06-expressions.html#infix-operations



文章来源: Scala - infix vs dot notation