为什么elixir没有基于类型的方法在实例上工作?

为什么elixir没有基于类型的方法在实例上工作?,elixir,Elixir,正在学习elixir,我想了解为什么elixir选择如此冗长,并基于助手方法进行操作,如: String.upcase(name) 而不是像这样做: name.upcase 在Scala中,您可以执行name.toUpperCase,它仍然会返回一个新变量,因为它是不可变的 不管怎样,只要试着理解这种方法的原因,因为我确信这是一个原因。在Elixir中没有对象或方法这样的东西。只有数据和函数可以作用于这些数据-两者是分开的。在Elixir中没有对象或方法之类的东西。只有数据和函数可以对这些数

正在学习elixir,我想了解为什么elixir选择如此冗长,并基于助手方法进行操作,如:

String.upcase(name)
而不是像这样做:

name.upcase
在Scala中,您可以执行
name.toUpperCase
,它仍然会返回一个新变量,因为它是不可变的


不管怎样,只要试着理解这种方法的原因,因为我确信这是一个原因。

在Elixir中没有对象或方法这样的东西。只有数据和函数可以作用于这些数据-两者是分开的。

在Elixir中没有对象或方法之类的东西。只有数据和函数可以对这些数据起作用-两者是分开的。

对于希望根据参数类型分派函数的少数情况,Elixir提供了

这是
to_string
等函数背后的机制,这些函数可处理多种不同的数据类型:

for something <- [1, DateTime.utc_now(), "hello"], do: something |> to_string
["1", "2017-07-31 02:23:54.773667Z", "hello"]
查找要使用字符串的内容
[“1”,“2017-07-3102:23:54.773667Z”,“你好”]

对于希望根据参数类型分派函数的少数情况,Elixir提供

这是
to_string
等函数背后的机制,这些函数可处理多种不同的数据类型:

for something <- [1, DateTime.utc_now(), "hello"], do: something |> to_string
["1", "2017-07-31 02:23:54.773667Z", "hello"]
查找要使用字符串的内容
[“1”,“2017-07-3102:23:54.773667Z”,“你好”]

虽然其他答案很好地回答了这个问题,但我想补充一些基本的理论问题

Scala是我所说的混合语言——主要是功能性的,但也提出了许多面向对象的思想。我还将把F#、斯威夫特和科特林也包括在这个标题下。一个OO思想是在特定对象上调用方法的概念——您提到的obj.method概念。正如您所意识到的,没有任何东西会迫使代码改变它所处理的值。也就是说,不会更改大写的字符串,而是返回一个新字符串

然而,开发人员很难打破旧习惯,其中一个习惯是希望符号改变对象(而不是复制对象并更改副本)。我们中的许多人都有多年的Java或C经验,这形成了我们对OO应该如何工作的期望——不管它是否必须以这种方式工作


在这一点上,让开发人员调用模块中的函数并传递他或她想要操作的值只会帮助开发人员开始开发一个更好的心理模型来描述实际发生的事情。虽然obj.method符号可能更为熟悉,但它也会导致开发人员对将要发生的事情产生错误的预期;我E它可能导致对可变对象的期望。

虽然其他答案很好地涵盖了这个问题,但我想补充一些基本的理论问题

Scala是我所说的混合语言——主要是功能性的,但也提出了许多面向对象的思想。我还将把F#、斯威夫特和科特林也包括在这个标题下。一个OO思想是在特定对象上调用方法的概念——您提到的obj.method概念。正如您所意识到的,没有任何东西会迫使代码改变它所处理的值。也就是说,不会更改大写的字符串,而是返回一个新字符串

然而,开发人员很难打破旧习惯,其中一个习惯是希望符号改变对象(而不是复制对象并更改副本)。我们中的许多人都有多年的Java或C经验,这形成了我们对OO应该如何工作的期望——不管它是否必须以这种方式工作


在这一点上,让开发人员调用模块中的函数并传递他或她想要操作的值只会帮助开发人员开始开发一个更好的心理模型来描述实际发生的事情。虽然obj.method符号可能更为熟悉,但它也会导致开发人员对将要发生的事情产生错误的预期;我E它可能导致对可变对象的期望。

如果我没有弄错的话,Elixir是一种函数式语言。这意味着
String
是一个文件,
upcase/1
是一个函数,变量
name
没有
upcase/1
的上下文。如果我没有弄错的话,Elixir是一种函数式语言。这意味着<代码>字符串是一个文件,而代码> Upase/1 是一个函数,变量<代码>名称<代码>没有上下文<代码> Upase/1 < /Cord>。我将沿着这条线回答一些问题,但我不确定Elixir与Erlang有多接近。在这一层面上,两者之间几乎没有什么区别。Erlang具有更好的语法和更多的内置功能。@PatNowak我不会说它有更好的语法,只是不同而已。我个人不介意Erlang语法。我打算用这些方法回答一些问题,但我不确定Elixir和Erlang有多紧密。在这一层面上,这两个词之间的差别很小。把灵丹妙药看作是更好的语法和更具内在特征的Erlang。@帕特诺克,我不认为它有更好的句法。完全不同。我个人并不介意Erlang语法。