什么时候可以省略括号,点,大括号,=(函数)等的精确规则?

什么时候可以省略括号,点,大括号,=(函数)等的精确规则?

什么时候可以省略(省略)括号,圆点,大括号,=(函数)等的精确规则?

例如,

(service.findAllPresentations.get.first.votes.size) must be equalTo(2).
  • service 是我的对象

  • def findAllPresentations: Option[List[Presentation]]

  • votes 回报 List[Vote]

  • 必须有规格的两种功能

为什么我不能去:

(service findAllPresentations get first votes size) must be equalTo(2)

编译器错误是:

“类型为Option [List [com.sharca.Presentation]]的RestServicesSpecTest.this.service.findAllPresentations不带参数”

为什么它认为我试图传递一个参数?为什么我必须为每个方法调用使用点?

为什么必须(service.findAllPresentations get first votes size)相等Too(2)导致:

“没找到:价值第一”

然而,“必须等于2” (service.findAllPresentations.get.first.votes.size)必须等于2,即方法链是否正常? - 对象链链链接。

我查看了Scala的书籍和网站,无法找到全面的解释。

事实上,正如Rob H在Stack Overflow问题中解释的那样,我可以在Scala中省略哪些字符?,这是省略'。'的唯一有效用例。是用于“操作数运算符操作数”样式操作,而不是用于方法链接?


潇湘沐
浏览 1168回答 3
3回答

阿波罗的战车

你似乎偶然发现了答案。无论如何,我会尽力说清楚。使用前缀,中缀和后缀表示法时可省略点 - 所谓的运算符表示法。使用运算符表示法时,只有这样,如果传递给方法的参数少于两个,则可以省略括号。现在,运算符表示法是方法调用的表示法,这意味着它不能在没有被调用的对象的情况下使用。我将简要介绍一下这些符号。字首:只有~,!,+并且-可以在前缀符号使用。这是当你写你所使用的符号!flag或val liability = -debt。中缀:这是方法出现在对象和它的参数之间的符号。算术运算符都适合这里。后缀(也是后缀):当方法跟随对象并且不接收任何参数时,使用该表示法。例如,您可以编写list tail,这是后缀表示法。只要没有方法,就可以毫无问题地链接中缀符号。例如,我喜欢使用以下样式:(list &nbsp;filter&nbsp;(...) &nbsp;map&nbsp;(...) &nbsp;mkString&nbsp;",&nbsp;")这与以下内容相同:list&nbsp;filter&nbsp;(...)&nbsp;map&nbsp;(...)&nbsp;mkString&nbsp;",&nbsp;"现在,为什么我在这里使用括号,如果filter和map只使用一个参数?这是因为我将匿名函数传递给他们。我不能将匿名函数定义与中缀样式混合,因为我需要一个边界来结束我的匿名函数。此外,匿名函数的参数定义可能被解释为中缀方法的最后一个参数。您可以使用具有多个参数的中缀:string&nbsp;substring&nbsp;(start,&nbsp;end)&nbsp;map&nbsp;(_&nbsp;toInt)&nbsp;mkString&nbsp;("<",&nbsp;",&nbsp;",&nbsp;">")使用中缀表示法很难使用Curried函数。折叠功能就是一个明显的例子:(0&nbsp;/:&nbsp;list)&nbsp;((cnt,&nbsp;string)&nbsp;=>&nbsp;cnt&nbsp;+&nbsp;string.size)(list&nbsp;foldLeft&nbsp;0)&nbsp;((cnt,&nbsp;string)&nbsp;=>&nbsp;cnt&nbsp;+&nbsp;string.size)您需要在中缀调用之外使用括号。我不确定这里的确切规则。现在,我们来谈谈postfix。Postfix可能很难使用,因为除了表达式的结尾之外,它永远不会被使用。例如,您无法执行以下操作:&nbsp;list&nbsp;tail&nbsp;map&nbsp;(...)因为尾部没有出现在表达式的末尾。你不能这样做:&nbsp;list&nbsp;tail&nbsp;length您可以使用括号来标记表达式的结尾来使用中缀表示法:&nbsp;(list&nbsp;tail)&nbsp;map&nbsp;(...) &nbsp;(list&nbsp;tail)&nbsp;length请注意,不建议使用后缀表示法,因为它可能不安全。我希望这已经消除了所有的疑虑。如果没有,只需发表评论,我就会看到我可以做些什么来改进它。
打开App,查看更多内容
随时随地看视频慕课网APP