首页   注册   登录

vencent

V2EX 第 98993 号会员,加入于 2015-02-20 20:17:39 +08:00
vencent 最近回复了
57 天前
回复了 vencent 创建的主题 程序员 留在上海的你,为什么选择留在上海了?
@wangkai0351 我这边一居室得 4500+,杭州同学 3000 就在公司附近租了个 loft
57 天前
回复了 vencent 创建的主题 程序员 留在上海的你,为什么选择留在上海了?
@leoliu168 被硬盘是什么?
102 天前
回复了 artoostark 创建的主题 DNS CloudXNS 停止解析不用怕
CloudXNS 为什么会停止解析?
感谢 @passerbytiny 的指教。

> len(string) 只是个函数,压根谈不上设定。

其实我认为在一门语言中,len 函数的作用应该保持一致性,也就是说,它不能一会儿表示的是数据的内存尺寸,一会儿表示的是容器的容量或长度。这方面 Python 做的非常好,所有内置类型表现的非常一致。包括 str 类型,返回的也是字符个数而不是 bytes 个数(顺便一提,感谢指出 Java、PHP 与字符串有关的 lengh 方法含义都是字节个数。不过我其实认为这样的“传统”是不对的)。即使自定义类型也可以实现 Sized 接口(即实现__len__方法)使得对象的长度可以通过 len 函数获取。而 go 语言的 len 函数对于其他内置类型来说获取的是容器的长度(即元素的个数),而对于 string 类型获取的却是字节数。这种奇怪的不一致我认为是它的设计问题。
必须是 dash 啊,配合 alfred 快速查文档效率高到飞起
赞同 @hhhsuan 的观点,要么就表示 bytes、要么就表示字符,不应该混在一起。
@dacapoday
@exonuclease
起初我也想过会不会“ len 的语义更接近于表示数据的尺寸,而非容器的容量或长度”。然而官方文档告诉我们:

func len(v Type) int

The len built-in function returns the length of v, according to its type:

Array: the number of elements in v.
Pointer to array: the number of elements in *v (even if v is nil).
Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
String: the number of bytes in v.
Channel: the number of elements queued (unread) in the channel buffer;
if v is nil, len(v) is zero.

可见除了 string 之外,其余类型作为 len 函数的参数获取到的都是“容器的容量或长度”
@yvescheung 能具体讲讲为什么 python 中这种坑更多吗?我主力语言是 python 但是没有感受到这种坑
我认为正常思路来说 len 代表了一个对象的长度,也就是“我能对它迭代多少次”,而 for-in 则是迭代的过程。这两个为什么会有不一样的表现?

我充分了解 rune 类型的存在,但是我想吐槽的其实是语言设计上的问题。既然你都有 rune 类型用来表示字符数组了,为什么 string 还会有这么怪异的表现...
我认为:
如果一个字符串是 byte 类型,那调用 len 函数获取到的就应该是有多少个 byte,for in 循环应该是对 byte 数组循环;
如果一个字符串是字符类型,那调用 len 函数获取到的就应该是有多少个字符,for in 循环应该是对字符数组循环。

这种调用 len 函数返回 byte 个数,for in 循环又变成对字符数组进行循环的怪异行为,就非常超出人的正常思维。

好吧,我说的是 go 语言。
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2550 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 9ms · UTC 14:29 · PVG 22:29 · LAX 07:29 · JFK 10:29
♥ Do have faith in what you're doing.