我已閱讀了多個樣式指南和其他資源,指出在方法/變量/其他名稱中使用下劃線是一個壞主意。Scala在名稱中加下劃線
背後有什麼技術原因?
我非常習慣於用_預先設定幫助功能。還有一些功能應該是我想要公開的私人功能,所以我可以通過REPL訪問它們。其他命名約定像使用「助手」後綴似乎很麻煩。
任何想法,將不勝感激!
我已閱讀了多個樣式指南和其他資源,指出在方法/變量/其他名稱中使用下劃線是一個壞主意。Scala在名稱中加下劃線
背後有什麼技術原因?
我非常習慣於用_預先設定幫助功能。還有一些功能應該是我想要公開的私人功能,所以我可以通過REPL訪問它們。其他命名約定像使用「助手」後綴似乎很麻煩。
任何想法,將不勝感激!
通配符運算符_
在Scala中被大量使用。所以:
xs map (_.x) // Call the x method of every element
xs map (_x) // Pass every element through the _x method
令人困惑。你必須仔細看看下劃線是否在前。
然而,內部下劃線更難迷惑:
xs map (my_method) // No similar form where _ stands for the list element
因此,這些都是問題較少,但下劃線仍然吸引眼球一點,當一個正在尋找倒閉。這可能是爲什麼他們不鼓勵,但說實話,我一直都在使用它們,特別是在隱式defs和內部變量等事物中,他們在界面中沒有太多或任何暴露。
我認爲這些規格只是強調在名稱。
以什麼(理智)的方式,你應該寫下面的,如果不是這樣?
object getterSetter {
var _variable: Option[Double] = None
def variable = _variable
def variable_=(newVal: Double) { _variable = Some(newVal) }
}
我認爲camelCase
,而不是embedded_underscores
的原因很簡單,Java使用的是與Java庫工作時,一致性只能保持這樣。
下劃線的前綴是_convention_;你仍然必須聲明它是私人的。此外,你可以使用'variableHidden'或其他任何數量的東西來代替'_variable'。 –
哦,你是對的。一定有這個困惑。但'variableHidden'?當真? –
我也使用'_variable',但Rex Kerr的答案中的參數很有趣。 –
我只知道我避免在名稱中強調的原因:它們是Scala語法的重要組成部分,它們遍佈整個地方。當然,你可以可以用來表示名字,但是在我的經驗中,它往往會減慢人類語法分析器的速度。
但我必須承認,我偶爾會在可變對象中爲私有變量使用下劃線前綴,如果我想公開方法的非下劃線名稱。如果我們可以使用像Haskell這樣的素數(foo')會很好,但是我認爲這在詞彙上會很困難。
除了在整個語言中使用_
,不僅僅是作爲通配符使用,還作爲公用API的一部分(如元組)(someTuple._1
等),它在某些情況下也由編譯器特別解釋。例如在設置器,其必須後綴_=
或在一元運營商,其中必須加上前綴unary_
。
當有人使用類似但不完全相同的「特殊名稱」時,所有這些都使得使用「特殊名稱」非常容易,或者錯誤地解釋了「普通名稱」。不管它是偶然發生還是缺乏知識都沒關係,但是當它發生時,你可能會花幾個小時尋找一個bug。所以不要使用它們,除非你真的必須這樣做。DSL一如既往例外。
這是一個非常構建的案例:你有一個'xs:Seq [T:{def x:U}]'。爲了發生錯誤,你需要一個'_x:{def apply(y:T):U}'。如果這三個約束中的任何一個都不存在,它就不會編譯。它必須被正確命名爲'_x',必須用一個'T'參數來調用,它必須返回一個'U'。我甚至沒有輕信。 –
@放羊 - 你不可能有這種名字相撞;重點在於,當您通過僅僅是熟悉的代碼快速閱讀時,您不會立即知道本地代碼中的私有方法還是集合元素上的公共方法正在播放。當然,你可以很快弄清楚,但如果你能從遠處看出形狀,你可以更快地找出答案。 –