簡體   English   中英

Scala錯誤:值 <FUNCTION_NAME> 不是對象的成員 <OBJECT_NAME>

[英]Scala error: value <FUNCTION_NAME> is not a member of object <OBJECT_NAME>

之后編輯:

  • 相關問題:

為什么Scala類方法不是一等公民?

Scala的動機是否強調形式語言理論和良好的風格?

_通配符或占位符語法的用法: Scala占位符語法

  • 在這個問題中,我試圖實現一種更緊湊的語法,而該解決方案涉及所謂的占位符語法 傑森·斯沃茨(Jason Swartz)的《 學習Scala》 (第74頁)進一步強化了這種觀點:

在處理數據結構和集合時,占位符語法特別有用。 許多核心排序,過濾和其他數據結構方法傾向於使用一流的功能,並且占位符語法減少了調用這些方法所需的額外代碼量。


問題體

我想了Scala的支持一階的功能,遇到這種問題,關於傳遞方法作為參數。 據我了解,解決方案是用(命名或匿名)一階函數包裝該方法。 這為我工作:

def wrapperFn(s:String):String = s.reverse

wrapperFn可以將wrapperFn作為參數傳遞給其他高階函數,或者作為值傳遞給其他類似這樣的定義:

val otherGoodFn:(String=>String) = goodWrapperFn

到現在為止還挺好。 當我嘗試混合兩個步驟(避免使用s參數的冗長使用),並將方法直接傳遞給函數類型的值時,問題就來了,就像這樣:

def errorFn:(String=>String) = String.reverse

這將引發以下錯誤:

error: value reverse is not a member of object String
   def errorFn:(String=>String) = String.reverse
                                                ^

我不明白,因為這按預期工作:

val s:String = "hello"
s.reverse

因此,顯然該方法是實例的成員,而不是Object / Class(??)的成員。似乎Scala以與Java完全不同的方式處理類和對象的生存期。 所以我的問題現在更加簡潔:

  • 該錯誤是由某些愚蠢的錯誤引起的還是確實不允許? 如果不允許,為什么?

提前致謝!

String.reverse將調用靜態方法(或object上的方法,而不是Scala術語中的類)。

你可以做

def errorWrapperFn:(String=>String) = _.reverse

通過下划線,您無需指定名稱即可訪問方法/函數參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM