国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Scala 的 val 遞歸定義

2022-07-08 22:12 作者:ZeromaX訸  | 我要投稿


還是在上次提到的知乎回答《一行 Scala 能實(shí)現(xiàn)怎樣喪心病狂的代碼》https://www.zhihu.com/question/51038841/answer/123883134?中,有使用遞歸定義的 val 的斐波那契數(shù)列和質(zhì)數(shù)的實(shí)現(xiàn):


斐波那契數(shù)列

質(zhì)數(shù)

學(xué)習(xí)過(guò)程中發(fā)現(xiàn),使用 REPL 顯然是可以成功運(yùn)行的,畢竟答主就是使用的 REPL。

REPL 執(zhí)行結(jié)果

但是在我自己平時(shí)使用的 object main 方法內(nèi)寫下如下代碼,編譯就會(huì)報(bào)錯(cuò):

代碼本身在 IDEA 中并不會(huì)報(bào)錯(cuò),但是執(zhí)行編譯時(shí)會(huì)報(bào)錯(cuò) “`forward reference extends over definition of value fib`”

編譯報(bào)錯(cuò)

看報(bào)錯(cuò)的內(nèi)容,大致是指我們?cè)诙x時(shí)使用 `fib` 的時(shí)候(即 `fib.scanLeft` 處)`fib` 本身還沒(méi)有定義好。那么經(jīng)過(guò)我的嘗試,發(fā)現(xiàn)如果想要不報(bào)錯(cuò),正常運(yùn)行,有三種修改方法:

可以參考 StackOverflow 上的一則討論 《Scala recursive val function inside val》(https://stackoverflow.com/questions/66409638/scala-recursive-val-function-inside-val)?

1. 將 `val fib` 和 `val primes` 提到 object 的大括號(hào)中,即:


2. 在 `val fib` 和 `val primes` 前面加上 `lazy`

3. 將 `val fib` 和 `val primes` 改為 `def fib` 和 `def primes`

方法是實(shí)驗(yàn)出來(lái)了,但是對(duì)應(yīng)的原理卻不太好解釋。

首先是 3 相對(duì)比較好理解,遞歸的方法自然是沒(méi)有問(wèn)題的。

其次是 2 使用 `lazy` 關(guān)鍵字,讓變量惰性加載,賦值后面的語(yǔ)句(`0 #:: fib.scanLeft(1)(_ + _)`)在 `fib` 第一次使用(`fib.take(10).toList`)時(shí)才真正執(zhí)行,也相對(duì)好理解。

奇怪的是,為什么遞歸 val 定義在 main 方法內(nèi)就會(huì)報(bào)錯(cuò),而 object 以及 REPL 中就可以正常編譯呢?這個(gè)問(wèn)題有待進(jìn)一步學(xué)習(xí)與研究。

Scala 的 val 遞歸定義的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
柘城县| 枣庄市| 高唐县| 东安县| 仪陇县| 苗栗县| 环江| 绥中县| 建平县| 桓台县| 巨野县| 嘉兴市| 视频| 砚山县| 临桂县| 全椒县| 宁安市| 延安市| 开封市| 扎鲁特旗| 噶尔县| 丹东市| 临夏县| 咸丰县| 营口市| 静安区| 东丽区| 高青县| 延安市| 白城市| 息烽县| 香港| 锦屏县| 靖边县| 贡觉县| 六枝特区| 太白县| 灵山县| 明溪县| 建湖县| 武清区|