program-in-chinese / overview

中文编程的历史、现状和展望。issue 中进行相关问题的讨论.
https://zhuanlan.zhihu.com/codeInChinese
GNU General Public License v3.0
386 stars 34 forks source link

一门语言中,其他值转化为 bool 值应该如何设计? #163

Closed luoyou closed 4 years ago

luoyou commented 5 years ago

一般编程语言中有两种流派,强类型与弱类型; 强类型的代表应该是 java,禁止任何隐式的类型转化,例如:0 && true,这种情况,应该直接抛错,int 类型不能进行 && 操作(我对java不熟,如果有错希望大家指出)。

弱类型允许隐式类型转化,这类语言很多,但是隐式转化的标准各不相同,例如:0, 0.00两种都是转成 false,但是字符串 '0' 转化的结果依然是false,而'0.00'转化的结是true,尤其在javascript这门语言中,隐式的类型转化非常混乱。

想请教下大家,应该如何设计其他类型到bool类型的转换,强类型还是弱类型,如果是弱类型的话,该如何设计转换值?

感谢。

nobodxbodon commented 5 years ago

个人认为这个功能不是必需。如果仅讨论设计,不妨先把常用语言的处理方式列出来比较看看?

jeffreybaoshenlee commented 5 years ago

我覺得,如果某一條隱式類型轉換規則,給用戶帶來的困擾遠遠大於幫助,那麼可能就得仔細考慮一下有沒有必要啓用這條規則了(當然有人也可以反過來說,用戶之所以產生困擾,是因為他沒有領會到規則背後的邏輯,因此,還要繼續理解和適應……)。另外,JavaScript 的怪癖,在某種程度上可能是由於歷史原因導致的,這個我沒有詳細研究過。

ArcticLampyrid commented 5 years ago

我个人是不推荐支持这种隐式转换了,造成的麻烦很可能大于收益 常用的现代语言,尤其是强类型语言,基本都不支持int与bool的转换 C/C++、ECMAScript更多的是出于历史原因

这种转换的用途很有限,通常比较多得是:

luoyou commented 5 years ago

@1354092549 @nobodxbodon @jeffreybaoshenlee 我也感觉隐式转换不太好,不过强类型进行显式转化,转换的规则也想问下大家

0 是否应该转成 false 0.00 -0 这两个该怎么转化

或者同样禁止显式的类型转换,必须让开发用 x == 0 x == 0.00进行判断

这里面也涉及到一个问题 0.00 == 0 结果是false的话,也就是允许int 与 float互转,但是禁止数值类型的转为 bool 类型,希望大家能提供比较好的看法

nobodxbodon commented 5 years ago

允许int 与 float互转

参考Is relational comparison between int and float directly possible in C?,刚试了一下JS中:

1==0.99999999999999999999999999
true

下面一答提到的"What Every Computer Scientist Should Know About Floating Point"一文,也许值得研究。

ArcticLampyrid commented 5 years ago

我觉得讨论一个feature有没有必要,先应当讨论这个feature能带来什么便利 然后再根据其可能引起的麻烦来判断是否有必要

我不认为在现代语言中,允许这种隐式转换能带来很大的便利

jeffreybaoshenlee commented 5 years ago

@nobodxbodon 嗯,我打開了 https://stackoverflow.com/a/1161740 答案裡提到的那篇文章,是一篇很硬的數理文字,確實得花功夫讀一讀。

另外,那位回答者認為,跟零值進行比較,似乎可以當成特例,加以通融。

ArcticLampyrid commented 5 years ago

注: float/double与int的隐式转换 相比 int与bool的隐式转换 在现代语言中要有用的多

ZoomQuiet commented 5 years ago

还有个思路... 不自动转化, 只提供内建专用函数... 这样, 也就杜绝了意外

qiqiworld notifications@github.com 于2019年7月18日周四 上午10:10写道:

注: float/double与int的隐式转换 相比 int与bool的隐式转换 在现代语言中要有用的多

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/program-in-chinese/overview/issues/163?email_source=notifications&email_token=AAAFPXQYVMIFB6B3YCKW5QDP77GIDA5CNFSM4IECLHO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD2HDJIA#issuecomment-512636064, or mute the thread https://github.com/notifications/unsubscribe-auth/AAAFPXQLCWKME64IZVRFHT3P77GIDANCNFSM4IECLHOQ .

-- life is pathetic, go Pythonic! 人生苦短, Python当歌! 俺: http://zoomquiet.io 授: http://creativecommons.org/licenses/by-sa/2.5/cn/ 怒: 冗余不做,日子甭过!备份不做,十恶不赦! KM keep growing environment culture which promoting organization learning!

nobodxbodon commented 5 years ago

请问有何进展?

luoyou commented 5 years ago

请问有何进展?

目前正在实现语言的大框架, 计划等数组功能实现之后, 再深入研究这些细节, 目前暂定的就是统一不转化.