2017-07-30 16 views
1

基於輔助方法,像剛剛學習仙丹,我想知道爲什麼靈藥選擇如此詳細和做的事情:爲什麼elixir沒有基於類型的方法在實例上工作?

String.upcase(name) 

而不是做它喜歡:

name.upcase 

在Scala中,你可以做name.toUpperCase,它將仍然返回一個新的變量,因爲它是不可變的。

無論如何,只是試圖瞭解這種方法的原因,我相信這是一個原因。

+0

如果我沒有弄錯Elixir是一種功能性語言。這意味着'String'是一個文件,'upcase/1'是一個函數,變量'''沒有'upcase/1'的上下文。 –

回答

6

在Elixir中沒有任何物體或方法。只有數據和功能可以處理這些數據 - 兩者是分開的。

+0

我打算回答這個問題,但我不確定Elixir離Erlang有多近。 –

+1

在這個水平上,兩者之間幾乎沒有什麼區別。 – michalmuskala

+0

考慮Elixir作爲Erlang具有更好的語法和更多的內置功能。 – PatNowak

0

對於少數情況下,如果您想根據參數的類型分配函數,Elixir提供了protocols

這就像to_string,在許多不同的數據類型作品背後的功能機械:

for something <- [1, DateTime.utc_now(), "hello"], do: something |> to_string 
["1", "2017-07-31 02:23:54.773667Z", "hello"] 
0

而其他的答案涉及這個問題相當不錯,我想補充一些底層的位理論問題。

斯卡拉就是我所說的混合語言 - 主要是功能性的,但也提出了很多面向對象的想法。我也會在該標題下加入F#,Swift和Kotlin。一個OO思想是在特定對象上調用方法的概念 - 您提到的概念。正如你已經意識到沒有任何東西強制代碼改變它正在處理的值。這不是改變上面的字符串,而是返回一個新的字符串。

然而,開發人員很難打破舊的習慣,一個習慣就是期待這個符號改變對象(而不是製作對象的副本並更改副本)。我們中的許多人擁有多年的Java或C#,這已經塑造了我們對面向對象應該如何工作的期望 - 它是否必須以這種方式工作。

在這一點上,感覺好像讓開發人員從模塊調用某個函數並傳遞他或她想要操作的值,只是幫助開發人員開始開發一個更好的實際內容的心智模型上。雖然標記可能更爲熟悉,但它也可能導致開發人員對將要發生的事情有不正確的期望;一世。即它可以導致對可變對象的期望。

相關問題