我正在學習Groovy,並且對它如何構建智能DSL有很深的印象,但是對於括號和點是可選的規則,我有點困惑。請看下面的代碼:Groovy可選圓括號和圓點
Integer take(Integer x) {x}
take 3 plus 4
可正常工作和生產的7的輸出(當在控制檯跑),如常規理解,最後一行是take(3).plus(4)
。
現在,println take 3 plus 4
不起作用,因爲groovy明白,這是廢話的println(take).3(plus).4
。
,我上線看到顯示了這些類型的表達自己每一個例子,但顯然
s = take 3 plus 4
作品和存儲着S結果7。我的問題是,爲什麼
println(take 3 plus 4)
不工作?顯然,groovy會解析這些表達式,即使它們本身不在一行上(如工作分配所示)。我認爲添加這些括號可以消除那種不起作用的形式的含糊性,並且它會打印出我想要的7。
相反,groovy給出了一個錯誤'意外的令牌:3'。據我所知,groovy不允許在println中使用可選的圓括號或點,儘管它似乎並不明確。這種技巧到底有什麼用?
這將解決爲什麼'的println取3加4'不起作用,然而不知其所以然'調用println(坐3加4)'不一樣應該不會在那裏有任何歧義(如果它被解釋爲多個參數,它們之間會有一個逗號,所以groovy應該能夠確定這不是什麼意思)。此外,該鏈接表示它不應該在任務中工作(儘管代碼示例顯示它正在工作),但它確實如此。我想知道現在是不是已經過時了。語言指南並不是非常嚴格,並且暗示它應該像最後一個表格一樣包裝。 – Matthew
+1向我展示瞭如何讓它在println中工作,但我不確定這是否能完全回答我的問題。 – Matthew
這是不明確的,因爲println方法不知道評估代碼**在對其執行操作之前,先取3加4 ** _to_ ** take(3).plus(4)**。 '='符號右邊的所有內容都是一個表達式,並在賦值給變量之前進行評估。 $ {}是先評估這個代碼,然後再調用println。 – dspano