为什么或者为什么不缩写某些数据类型的核心函数

Why or why not a shorthand for core functions for certain data types?

本文关键字:数据类型 核心 函数 或者 为什么不 缩写 为什么      更新时间:2023-11-30

在Ruby中,您可以编写类似"hello".upcase的东西,而在Javascript和Elm等许多其他语言中,这需要类似String.upcase("hello")的样式。这感觉是多余的。

当库的名称表示函数的某个参数的数据类型(例如,像String.upcase(string_type_argument)这样的函数),可能是[special character]upcase(string_type_argument)时,是否有任何语言实现了与核心数据类型(字符串、列表/数组等)相关的函数的简写?这有利弊吗?

我意识到,在Elm中,一种选择是导入函数(例如import String exposing (..)import String exposing (some, specific, functions)),但它们会令人困惑(导入具有潜在重叠函数名的整个核心库),或者会因为额外的工作而烦恼(使特定的函数导入与正在使用或未使用的内容保持最新)。

JavaScript使用原型,让我们以字符串为例:

String.prototype本质上是所有字符串操作方法的容器。

示例:

String.prototype.toUpperCase = function() {
 // makes the string uppercase and returns it
 // this is a native method
}

您可以简单地在任意字符串上调用此函数,如下所示:

'var name = 'john';
name.toUpperCase() = //JOHN;'

甚至:

'john'.toUpperCase();

现在,让我们假设toUpperCase函数不存在,我们必须复制它的功能

我们可以通过以下几种方式:

将其添加到String.prototype:

String.prototype.NEWUPPERCASEFUNCTION = function() {
  // we can refer to the 'string' that is always left of the dot with 'this'   
  // which is a reserved word in JS:
  return 'this' in uppercase
}

这通常是不赞成的,并可能导致问题

另一种更常见的方法是,只创建一个函数,在该函数中传入一个字符串,并返回该字符串的大写版本,或者在"大写"之后返回该字符串:

function upperCaser(string) {
 // not gonna write out the logic here, but you get it
 return updated string
}

String.doThing("str")"str".doThing()这样的格式实际上没有区别。在Java中,这种差异被称为"静态"方法与"实例"方法。

当然有语言有简写编码格式,但唯一的区别是代码的简洁性。"编译器"仍然生成相同的"已编译"代码(或非常相似的代码)。

区别在于Ruby和JavaScript是面向对象的语言,而Elm是纯函数式语言。

在面向对象的语言中,范例是定义一个类(像String类),它将一些局部状态和一些方法打包在一起。这些方法有权读取本地状态并对其进行修改。"str"String类的一个实例,因此它有一些可以被称为"on it"的方法可以访问该内部状态,因此例如可以返回"STR"

Elm是一种纯粹的函数式语言。它没有对象,只有接受这些值并返回其他值的值和函数。函数被分组为"模块",但模块没有任何本地状态,因为不存在"模块的实例"这回事。

可能令人困惑的部分是,Elm同时具有String类型String模块,该模块封装了一组作用于字符串的函数。

因此,"str"String类型的值,而toUpper是一个函数,它接受String类型的值并返回另一个String类型的值。它是在String模块中定义的,所以您可以像String.toUpper("str")一样调用它,但String是模块,而不是类型。