既然字符串是一个 char 数组, 为什么语言还要定义 String 的方法,而不是是直接用 Array 的方法?

2017-07-15 21:21:25 +08:00
 xrr2016

如题, 定义 String 的方法是否多此一举,增加了程序员的负担。

4896 次点击
所在节点    程序员
44 条回复
changwei
2017-07-15 22:51:28 +08:00
@xrr2016 也不是,utf8 这种实现一般情况下是三个字节代表一个汉字,如果用 array,做 substring 还得各种数学上的 x3,+1,-1 的计算,还是麻烦。
hand515
2017-07-15 22:51:31 +08:00
这个问题我联想到,既然有 byte 数组,为啥还要定义 int,long
shihira
2017-07-15 22:54:41 +08:00
同样,多数动态语言中 string 表现为 immutable,而 array 表现为 mutable,也是这个原因。
xrr2016
2017-07-15 22:58:15 +08:00
@shihira 嗯, 多谢解释
beginor
2017-07-15 23:03:10 +08:00
突然想起一个段子,计算机最终执行的不都是 0 1 么, 为啥还要整各种开发语言?
sagaxu
2017-07-15 23:10:50 +08:00
@xrr2016 string 有一些特有的算法,比如忽略大小写的匹配,array 如何做到?
AckywOw
2017-07-15 23:21:49 +08:00
因为人懒
nbndco
2017-07-15 23:25:54 +08:00
String 当前的实现几乎都复杂到一定境界了……怎么可能只是几个字符串匹配函数的目的而已……
gyorou
2017-07-15 23:27:15 +08:00
一般来说,string 可以看成是以某种编码下的 code point 的容器。这个容器可以是 list 或者是 array。
所以感觉上来说,string 的抽象层次更高。
这种抽象,无论是用面向对象概念的类来实现,还是通过 protocol 统一接口来实现,
必然会有一系列名称和操作类似的方法或者函数。
wohenyingyu02
2017-07-15 23:48:51 +08:00
为什么是负担?你不想用完全可以不用
zhicheng
2017-07-16 00:39:08 +08:00
C 语言教材和 C 语言标准库最大的错误就是让人觉得 C 有 “字符串” 这个类型,无论 char * 还是 char [] 都不是字符串,它们只是 “字节数组” ,C 标准甚至都没有规定 char 是 signed 还是 unsigned。同时 C 语言也没有规定一个字节是多少 bit。C 语言诞生的时候字符串没有现在这么重要,所以只是简单的 “约定” 了一下用 '\0' 结尾的字节数组作为字符串,并实现了相关函数。现在应该尽量避免用 '\0' 结尾的字节数组来模拟字符串。
secondwtq
2017-07-16 02:03:07 +08:00
Haskell 就是和 C 一样直接拿 [Char] 当 String,不过用起来比 C 的要舒服得多
虽然貌似实际多数人都在用 text ...
wwqgtxx
2017-07-16 02:20:44 +08:00
当你学 c++11 14 17 的时候也会觉得很多东西都已经存在了,为什么 stl 还要实现一遍,最后当你能熟练运用这些库的时候你就会明白他存在的意义了
congeec
2017-07-16 02:24:44 +08:00
@wwqgtxx std::array 用起来炒鸡爽
xupefei
2017-07-16 05:26:17 +08:00
有些字符串并不是简单的数组,例如 Windows API 常用的 UNICODE_STRING 结构体。
msg7086
2017-07-16 05:39:40 +08:00
其实就是,既然代码都是指令,为啥还要定义各种高级语言而不直接使用机器指令呢。
增加程序员的负担?你说反了吧。
yulon
2017-07-16 06:00:56 +08:00
C++ 的 string 都被喷成啥样了,这还有开倒车的。。。
gnaggnoyil
2017-07-16 06:18:35 +08:00
LZ 根本的问题还是没有区分开字符串和字符存储区的概念.在这一点上 C 的简单粗暴的抽象方式难辞其咎.

不过同样让 C 难辞其咎的还有,部分评论中的字符和编码字符的字节区分不开来的趋势……
Quaintjade
2017-07-16 09:23:47 +08:00
Javascript 的 char[]形式是从 ES5 才开始规范的,所以像 IE7 之类远古浏览器不支持。
shuson
2017-07-16 09:56:37 +08:00
用 c++做解释

String 里包装了一个 array,帮你做 malloc 和 free,用\0 管理长度,并提供一系列方便的方法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/375629

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX