在Ruby中,您可以编写类似"hello".upcase
的内容,而在许多其他语言(如Javascript和Elm)中,这需要类似String.upcase("hello")
的样式。这感觉多余。
当库的名称表示函数的某个参数的数据类型时,是否有任何语言实现与核心数据类型(字符串,列表/数组等)相关联的函数的简写(例如{{1}等函数也许String.upcase(string_type_argument)
?这有利有弊吗?
我意识到在Elm中,一个选项是导入函数(例如[special character]upcase(string_type_argument)
或import String exposing (..)
),但它们令人困惑(导入整个核心库可能重叠的函数名称),或者令人讨厌额外的工作(保持特定功能导入最新的使用或不使用的东西)。
答案 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
是模块,而不是类型。