为什么或为什么不是某些数据类型的核心功能的简写?

时间:2016-04-03 03:02:03

标签: javascript ruby function elm

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

当库的名称表示函数的某个参数的数据类型时,是否有任何语言实现与核心数据类型(字符串,列表/数组等)相关联的函数的简写(例如{{1}等函数也许String.upcase(string_type_argument)?这有利有弊吗?

我意识到在Elm中,一个选项是导入函数(例如[special character]upcase(string_type_argument)import String exposing (..)),但它们令人困惑(导入整个核心库可能重叠的函数名称),或者令人讨厌额外的工作(保持特定功能导入最新的使用或不使用的东西)。

3 个答案:

答案 0 :(得分:2)

JavaScript适用于原型,例如:#/ p>

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
}

这通常是皱眉,可能会导致问题

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

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

答案 1 :(得分:1)

String.doThing("str")"str".doThing()等格式之间几乎没有区别。在Java中,这种差异被称为“静态”与“实例”方法。

当然 语言有简写编码格式,但唯一的区别在于 source 代码的简洁。 “编译器”仍然生成相同的“编译”代码(或非常相似)。

答案 2 :(得分:0)

不同之处在于Ruby和JavaScript是面向对象的语言,而Elm是一种纯函数式语言。

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

榆树是一种纯粹的功能语言。它没有对象,只有值和函数来获取这些值并返回其他值。函数被组合成"模块",但模块没有任何本地状态,因为没有"模块的实例"。

可能令人困惑的部分是Elm有一个String类型一个String模块,它打包了一堆作用于字符串的函数。

因此"str"String类型的值,toUpper是一个采用类型String的值并返回另一个类型String的值的函数}。它在String模块中定义,因此您将其称为String.toUpper("str"),但String是模块,而不是类型。