您会使用Trilean(True,False,??)吗?


22

有时我有一个应返回true或false的函数。但是有时三个可能的值会更有意义。

在某些语言中,这些情况将使用整数或例外进行处理。

例如,如果用户年龄超过18岁,则要处理该用户的年龄。而且您具有这样的功能。

if(user.isAdult(country_code)){
     //Go On
}else{
     // Block access or do nothing
}

但是在某些情况下,取决于您的应用程序的构建方式,我可以看到生日字段不完整的情况。然后,此函数应返回未确定的内容。

switch(user.isAdult()){
    case true:
        // go on
        break;
    case undetermined:
        //Inform user birthday is incomplete
    case false:
        //Block access
}

正如我说过的,我们可以使用Exceptions和Int来处理它,但是我发现在语言中嵌入一个true,false,undefinedtermed而不是使用一些内部定义的常量是很性感的。



2
@Anna Lear:该死,你击败了我。^^
gablin 2010年

3
加布林:该死,你甚至殴打我抱怨安娜。
user281377 2010年

1
gh,我也想买T,F,FNF!握紧拳头
Mike M. 2010年

4
@ gablin,@ ammoQ,@ Mike M .:对不起。:)
亚当·李尔

Answers:


33

可以使用枚举,整数,符号(例如Lisp,Ruby),可为空的类型(将null用作不确定状态),选项类型(例如ML)或某些类似的构造(取决于您的语言)来处理。

因此,尽管您的示例和基本原理尚可,但我看不到它是要开发的语言功能的优先列表。


C / C ++中的null应该等于false。在这些情况下,您必须返回-1。我认为不确定状态相当常见,但总是会以不同的方式对待,因为这种语法实际上并不存在。在Java中,布尔函数不能为布尔函数返回true或false以外的任何值。因此,您不得不使用其他类型,并很好地记录返回值。
卢瓦克福雷-拉克鲁瓦

@Sybiam- 在适当的地方使用其他类型没有任何问题。正如我所说的,我可以看到一个三进制类型的参数,但是我看不到它很快就会被添加到现有语言中。
克里斯·弗雷德

6
@Sybiam:在Java中,您可以返回布尔值,可以是null。在C / C ++中,您可以返回一个枚举。
Macneil 2010年

这太疯狂了!
卢瓦克福雷-拉克鲁瓦

2
@Macneil也许是斯巴达吗?
syockit 2011年

5

我还没有看到有必要这样做的情况。在您给出的示例中,如果必须填写该字段,则应在其他地方进行验证。isAdult()本质上是两种状态的方法:您要么是,要么不是。无需执行任何操作,但如果遇到无法处理的数据,则返回false。例如:

switch(user.isAdult()){
   case true:
      // go on
      break;
   default:
      // Block access.
}

2
如果数据无效,它可以要求用户进行修复,这与未成年人(您不要求该人输入新年龄)不同。这是两种不同的行为。例如,某些社交网站可让您输入不完整的生日以保护隐私。
卢瓦克福雷-拉克鲁瓦

2
我认为验证应该在代码的其他区域/部分中进行。首先验证数据,然后对其进行操作。
Michael K 2010年

1
@Sybiam:通常,应用程序在需要时不会偶然请求数据。您可以.isAdult()查询用户本身,如果这确实是您想要的,那会更好。
David Thornley 2010年

5

正确,错误,未知

是的,不,也许

在C#中,您可以使用可为空的布尔值(现在您可能会反感)

在MS-SQL中,可以使用可为空的位字段(ditto)


2
可为空的布尔值的问题不在于它们具有空值,以至于大多数人(包括我在内)对三值逻辑一无所知。哪一个,对于初学者:scientopia.org/blogs/goodmath/2010/08/24/...
弗兰克Shearar

正确/错误/无。
Lennart Regebro 2010年

2
有趣的是,很多人都理解二进制,八进制和十六进制,但是却不能将思维围绕三元。这是为什么?同样的事情,只要以三为基...就可以解决三值逻辑问题。
Michael K 2010年

5
大多数人只是对这种恐惧unknown
dan04 2011年

2

在C ++中,可以使用非bool返回类型或通过引发异常来处理。如果要使用三值返回类型,请使用enum。它虽然不那么性感,但确实有效,而且更重要的是您可以做到这一点,而不会为我们其他人弄乱语言。

具有bool三值会导致问题。bool foo; ... if (foo)...假设foo可能具有三个值中的任何一个,您将如何处理?具有bool变量的优点是始终始终是foo!foo始终为真。它有助于推理程序。

检查人们在可能会获得NaN值的情况下进行数字处理的方式。情况很复杂。我宁愿不必对普通的布尔处理进行处理。

如果您要.isAdult()处理的信息不足,请在内部进行处理,然后返回truefalse。否则,每次使用它时,都需要先检查返回码,然后再进行其他操作,并想出一种处理它的方法。这意味着您必须检查文档,以查看某个函数是否确实按照其名称所说明的那样进行操作,这对于可读性而言将是一场灾难。


2

这个想法很有用。有一个涉及不确定性的整个领域称为模糊逻辑

对于我们程序员而言,幸运的是,您可以使用标准语言功能实现模糊逻辑。

例如,在您给出的情况下,可以通过询问用户轻松确定不确定信息。因此,像您描述的三态枚举将正常工作。

还有许多其他不确定的方法。这些问题包括:

  • 明天会下雨吗?它尚未发生,所以没有人知道-但是您可以进行有根据的猜测并给出概率。
  • Beta Pictoris恒星的太阳系中的行星上是否存在多细胞生命?它有一个肯定的是或否的答案,但是我们目前无法确定那是什么。

使用0.0(false)到1.0(true)范围内的概率并应用浮点数学可以解决许多这样的问题。

计算化学家和计算机科学家David E. Shaw将这种事情应用于华尔街,目前价值约25亿美元。是的,这很有用。:-)


1

许多年前,我使用了一些将信念分配给值的算法。很有趣。最终,我从中得到的是布尔值通常是人为的。确实,它应该是true / false / other等三重值。在实验中,这似乎为我带来了“最佳”代码。从那以后,我就屈服了,做着其他所有人都做的事情,同时在内部思考如果我们放弃以同样的旧方式做事的话,它会变得多么简单... :-)


0

不过,通过使用整数任意处理切换,Case或Switch语句对此可以很好地工作。

另外,在Ruby中,虽然在某些情况下'nil'返回为false,但是如果使用相等运算符,则nil == false返回return false,因此可以使用ruby nil来处理三元逻辑。


0

在您的情况下,另一种选择可能是通过应用“告诉不要询问”主体来反转控件并将其更改为(对单词成年,脑部阻塞表示抱歉):

user.isAdult(new OnlyAllowAdultsToLogin())

在哪里OnlyAllowAdultsToLoginStrategy实现一个接口:

interface UserAdultnessPolicy
{
   void userIsAdult();
   void userIsChild();
   void userAdultnessIsUnknown();
}

怎么void userIsAdult()办?也许你的意思是bool userIsAdult()
Timwi 2010年

0

我儿子问我如何有效地执行类似于此的测试。被测试的标志只有true / false,但是matchkey具有三个状态(必须为true,必须为false,否则我不在乎)。当然,这可以用2位数据结构和一点点混乱来实现,但是确实需要对这类代码进行注释,因为仅通过查看代码就难以分辨其目的。


0

C具有在大多数库函数中实现的此功能。例如,strcmp比较2个字符串,如果相同则返回0;如果第一个大于2,则返回1(即任何正整数);如果第二个大于第一个,则返回-1(即任何负整数)。 。

可以在其他地方使用相同的方法,即+ / 0 /-作为三态。如果知道false和其他任何值为true,则还可以对这些值执行布尔逻辑。


0

对于C ++,Boost实际上实现了Tribool,其描述如下:

tribool类的行为类似于内置的bool类型,但适用于三态布尔逻辑。这三个状态分别为true,false和indeterminate,其中前两个状态与C ++ bool类型的状态等效,最后一个状态表示一个未知的布尔值(可能不正确,我们不知道)。


-1

VB6复选框具有此功能。复选框的值可以是0 =关闭,1 =打开,2 =灰色

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.