亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

=>、()=>和Unit=>之間有什么區別?

=>、()=>和Unit=>之間有什么區別?

=>、()=>和Unit=>之間有什么區別?我試圖表示一個不帶參數且不返回值的函數(如果您必須知道的話,我將在JavaScript中模擬setTimeout函數)。case class Scheduled(time : Int, callback :  => Unit)不編譯,說“‘val’參數可能不是按名調用”。case class Scheduled(time : Int, callback :  () => Unit)編譯,但必須奇怪地調用,而不是Scheduled(40, { println("x") } )我必須這么做Scheduled(40, { () => println("x") } )同樣有效的是class Scheduled(time : Int, callback :  Unit => Unit)但卻以一種更不明智的方式被調用。 Scheduled(40, { x : Unit => println("x") } )(單元類型的變量是什么?)我想要當然,它是一個構造函數,如果它是一個普通函數,可以我調用它的方式調用它: Scheduled(40, println("x") )把他的瓶子給孩子!
查看完整描述

3 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

case class Scheduled(time : Int, callback :  => Unit)

這個case修飾語使隱含val從每個參數中取出構造函數。因此(正如有人指出的)如果你移除case您可以使用按名稱調用的參數。編譯器可能無論如何都允許它,但是如果它創建了val callback而不是變成lazy val callback.

當你改變到callback: () => Unit現在,您的情況只是接受一個函數,而不是一個按名稱調用的參數。顯然,該函數可以存儲在val callback所以沒問題。

得到你想要的東西的最簡單的方法(Scheduled(40, println("x") )其中,使用按名稱調用參數傳遞lambda)可能是跳過case并顯式創建apply你一開始是無法得到的:

class Scheduled(val time: Int, val callback: () => Unit) {
    def doit = callback()}object Scheduled {
    def apply(time: Int, callback: => Unit) =
        new Scheduled(time, { () => callback })}

在使用中:

scala> Scheduled(1234, println("x"))res0: Scheduled = Scheduled@5eb10190

scala> Scheduled(1234, println("x")).doit
x


查看完整回答
反對 回復 2019-07-15
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

在這個問題中,您希望用JavaScript模擬SetTimeOut函數。根據以前的答案,我編寫了以下代碼:

class Scheduled(time: Int, cb: => Unit) {
  private def runCb = cb}object Scheduled {
  def apply(time: Int, cb: => Unit) = {
    val instance = new Scheduled(time, cb)
    Thread.sleep(time*1000)
    instance.runCb  }}

在REPL中,我們可以得到如下內容:

scala> Scheduled(10, println("a")); Scheduled(1, println("b"))a
b

我們的模擬行為與SetTimeOut不同,因為我們的模擬是阻塞功能,但SetTimeOut是非阻塞的。


查看完整回答
反對 回復 2019-07-15
  • 3 回答
  • 0 關注
  • 823 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號