DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: liy187
今日帖子: 0
在线用户: 12
导航: 论坛 -> 经典工具 斑竹:liumazi,ruralboy  
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2018/4/16 21:59:04
标题:
发现一个TBooleanHelper的Bug 浏览:2177
加入我的收藏
楼主: bug很低级,也很简单. 已经有人报告了: https://quality.embarcadero.com/browse/RSP-16922
令人吃惊的是已经一年多了还没有修正

EMB看来人手真的太少

简单描述一下:

  TBooleanHelper = record helper for Boolean

    function ToString(UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline;
   class function ToString(const Value: Boolean; UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string; overload; inline; static;
end

var
  b:Boolean;
begin
  b:=False;
  b.ToString(True); -->应该调用上述两个方法的那一个版本?

end;

更搞笑的是这个定义:
  TUseBoolStrs = (False, True);
是嫌世界还不够乱吗?还真有老美的风格!
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 looper (keyo) ★☆☆☆☆ -
盒子活跃会员
2018/4/16 22:52:45
1楼: var
  b: Boolean;
begin
  b:= False;
  ShowMessage(b.ToString(TUseBoolStrs.True));//要带TUseBoolStrs
  
  ShowMessage(Boolean.ToString(b, TUseBoolStrs.True)); //这样应该也可以
end;

这样打印出来是"False"

我这两天正好用到这个,没问题啊
----------------------------------------------
虽千万人吾往矣!
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2018/4/16 23:32:31
2楼: 你的注释已经说清楚了啊,因为你带上了TUseBoolStrs,绕开了这个问题

如下测试都能通过:
procedure TnpMiscTF.testBoolToStr;
var
  b1:Boolean;
begin 
  b1 := True;
  Assert.AreEqual('-1', b1.ToString);
  Assert.AreEqual('-1', b1.ToString(True)); //bug
  Assert.AreEqual('True', b1.ToString(TUseBoolStrs.True));

  b1 := False;
  Assert.AreEqual('0', b1.ToString);
  Assert.AreEqual('-1', b1.ToString(True)); //bug
  Assert.AreEqual('False', b1.ToString(TUseBoolStrs.True));
end;
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2018/4/16 23:35:19
3楼: 我认为, 主要是这个定义太操蛋:

TUseBoolStrs = (False, True);

False,True已经是有特殊含义的关键字了,再这样定义一下简直就是诱导人犯错.
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 looper (keyo) ★☆☆☆☆ -
盒子活跃会员
2018/4/17 6:25:27
4楼: 确实很诡异的写法,我刚用的时候也很懵逼
----------------------------------------------
虽千万人吾往矣!
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2018/4/17 8:47:18
5楼: 我习惯这样用:
const
  BoolStrs: array[Boolean] of string = ('False', 'True');
var
  b: Boolean;
begin
  b := True;
  ShowMessage(BoolStrs[b]);
  b := False;
  ShowMessage(BoolStrs[b]);
...^o^
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 drroc (mvcxe) ★☆☆☆☆ -
盒子活跃会员
2018/4/17 9:04:17
6楼: IfThen
----------------------------------------------
MVCXE中国首个DELPHI MVC WEB框架:https://www.mvcxe.com/
作者:
男 zwjchinazwj (蒲石) ★☆☆☆☆ -
普通会员
2018/4/17 10:55:36
7楼: 眼高手低比能力不足更可怕,没有清醒的自我认知,EMB现在就是这样。
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2018/4/18 20:45:46
8楼: 这奇葩的用法,中标的路过。。。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 liminx (liminx) ★☆☆☆☆ -
普通会员
2018/4/19 8:39:34
9楼: 这种用法确实蒙住不少人。
----------------------------------------------
-
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2018/4/19 10:02:43
10楼: 哈  这个其实不算BUG, 只能说是一种无奈的选择, 原因其实也很简单:

TBooleanHelper有2个ToString方法:
一个是对象方法 function ToString(UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string;
一个是类方法 class function ToString(const Value: Boolean; UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False): string;

下面就是关键了, 估计是出于统一格式的要求, 所以这2个方法的UseBoolStrs属性都被定义成了包含默认值, 但是类方法的tostring第一个参数又要传递一个boolean类型的值

所以, 如果把UseBoolStrs也定义成boolean类型, 那么就会造成你调用ToString(True)时, 系统无法知道你是想调用对象方法ToString(True)还是类方法ToString(True, False)

所以, 就只能把UseBoolStrs这玩意又重新封装出一个新类型, 保证不会在使用默认值属性时出现歧义

至于解决方法么....呵呵 见仁见智了
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 scarlette (Scarlette) ★☆☆☆☆ -
普通会员
2018/4/19 23:48:48
11楼: 这也是炒鸡脑残的设计,非要用个默认参数…其实overload一下不就结了…
----------------------------------------------
-
作者:
男 zwjchinazwj (蒲石) ★☆☆☆☆ -
普通会员
2018/4/20 12:09:27
12楼: 09年到今天,用近10年的时间去证明脑残,代价太大了。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/4/20 20:37:43
13楼: 虽然大家证明了 EMB 脑残。
但是,你们好像也证明了一部分人也脑残。
至于是哪一部分,你们自己对号入座吧。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 boyla (土著巫师) ★☆☆☆☆ -
普通会员
2018/4/22 14:52:26
14楼: 没有问题最好,有问题能避开就避开吧。刚从C++Builder转过来,移植了一个练手APP,昨天为了验证大家所说Delphi的BUG,开C++Builder发现if else 语句不会写了,这才是程序猿最大的BUG。:)
----------------------------------------------
妹聊的不是BUG是追求,哥写的不是CODE是梦想。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/4/22 16:33:39
15楼: 学会 pascal ,别的语言就忘光了。这就是 pascal 还活着的唯一理由。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 yayongm (昵  称) ★☆☆☆☆ -
盒子活跃会员
2018/4/27 15:03:56
16楼: c系的语言还是不敢忘的,况且c系语言很多,比如:php,c#,java,js等等。。。
----------------------------------------------
弱小和无知不是生存的障碍,傲慢才是!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行81.05469毫秒 RSS