刚刚学习灵丹妙药,我想了解为什么灵药选择如此冗长,并根据辅助方法做事:
String.upcase(name)
而不是像:
name.upcase
在Scala中,您可以执行name.toUpperCase
,它仍将返回一个新变量,因为它是不可变的。
无论如何,只是想了解这种方法的原因,因为我确信这是一个原因。
答案 0 :(得分:6)
Elixir中没有对象或方法之类的东西。只有数据和功能可以对这些数据起作用 - 两者是分开的。
答案 1 :(得分: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"]
答案 2 :(得分:0)
虽然其他答案很好地涵盖了这个问题,但我想补充一些潜在的理论问题。
Scala就是我所说的混合语言 - 主要是功能性的,但也提出了许多OO想法。我也会在这个标题下包括F#,Swift和Kotlin。一个OO想法是在特定对象上调用方法的概念 - 您提到的 obj.method 概念。正如你已经意识到,没有什么能够迫使代码改变它正在发挥作用的价值。这不是更改大写的字符串,而是返回一个新字符串。
然而,开发人员很难打破旧习惯,而且一种习惯是期望用符号来改变对象(而不是制作对象的副本并更改副本)。我们中的许多人都有多年的Java或C#,它们已经形成了我们对OO如何工作的期望 - 无论它是否必须以这种方式工作。
此时,感觉好像让开发人员从模块调用函数并传递他或她想要操作的值只是帮助开发人员开始开发一个更好的心智模型来实际发生的事情。虽然 obj.method 符号可能更为熟悉,但它也可能导致开发人员对将要发生的事情抱有错误的期望;一世。即它可以导致对可变对象的期望。