2013-05-26 75 views
0

函數我有以下階文件,test.scala調用來自不同類從不同的封裝

package p1 { 
    object ty { 
     def f() = print ("p1.ty.f") 
    } 
} 

package p2 { 
    object ty extends App { 
     def f() = println (" in p2.ty.f , in " + p1.ty.f) 
     // calls above function 
     ty.f 
    } 
} 

當我試圖運行使用sbt上面的代碼(與命令行p2.ty)它輸出以下內容:

p1.ty.f in p2.ty.f , in() 

,而我希望以下內容:

in p2.ty.f , in p1.ty.f 

是什麼導致了這種行爲 - 我錯過了什麼?

+0

。實際的函數調用如下所示:'p1.ty.f()'和'ty.f()' – tenshi

+0

我不這麼認爲,因爲在scala中,沒有參數的函數可以不帶參數地調用,糾正我,如果我錯誤的 – ajduke

回答

1

p1.ty.f不會返回任何內容(它實際上會返回Unit),因此將此函數的結果與另一個字符串" in p2.ty.f , in " + p1.ty.f連接起來沒有任何意義。因此,print ("p1.ty.f")將首先執行並將打印p1.ty.f,然後println (" in p2.ty.f , in " + p1.ty.f)將被執行並將打印in p2.ty.f , in(),因爲()Unit的字符串表示形式。

所以要實現你需要寫像這樣期望的結果:我認爲你已經錯過了括號

package p1 { 
    object ty { 
    def f() = "p1.ty.f" 
    } 
} 

package p2 { 
    object ty extends App { 
    def f() = println (" in p2.ty.f , in " + p1.ty.f()) 
    ty.f() 
    } 
} 
+0

但爲什麼'print(「p1.ty.f」)'先執行? – ajduke

+0

@ajduke因爲'print'函數將字符串打印到控制檯(stdout)並且不會產生任何結果。唯一的目的是執行這種副作用。只要看看它的定義:https://github.com/scala/scala/blob/master/src/library/scala/Console.scala#L130 – tenshi

+0

好吧。 p1.ty.f()將首先刷新它的流,然後p2.ty.f()。我的意思是println在這裏 – ajduke