在写'如果(foobar的==(“本” ||“是”))`检查foobar的等于“这个”或“说:”支持的任何主要语言?
-
22-07-2019 - |
题
我是能够在一些像这样的语言写的if语句淡淡的记忆:
if (foobar == ("this" || "that"))
代替:
if (foobar == "this" || foobar == "that")
后者是更详细的,并且因此不太美观我。
在任何主要语言的支持前者约定?是否有这是为什么没有得到广泛支持的理由吗?
解决方案
在图标编程语言具有此功能。
通过使用发电机,你可以做
if i = (0 | 1) then write("0 or 1")
其中成功若i = 0或I = 1甚至可以做到:
if (i | j | k) = (0 | 1) then write("0 or 1")
其中如果成功任何的i,j或者k是等于0或1。
这背后的基本思想是每个那些(1|2|3..)
序列创建一个发生器,直到它耗尽值,将返回每个值反过来。当你在这样的布尔sitation使用发电机,值将从发电机请求,直到比较成功。当你在比较的两边结合两个发电机,所有可能的组合都被尝试,直到有一个人成功。 (相反返回虚假的,等于运算符“失败”,如果值不相等。)
其他提示
我似乎记得帕斯卡有一个in
声明如下所示:
if x in (foo, bar) then
...
至于为什么它没有更广泛的支持,我百思不得其解。这似乎是一个相当不错的一块语法糖。
我记得使用语法的唯一地方是在COBOL,大约25年前。
我怀疑这是没有得到广泛支持的原因是因为它会导致编译器无法解决歧义。在特定情况下,这不是一个特殊的问题,因为“这个”,“那个”都是字符串,为此,有条件的或经营者是没有意义的。但考虑这个片段中,在像C,其中一个条件的结果是布尔值0或1的语言:
int a = 22;
int b = 99;
int rslt = SomeFunction();
if (rslt == (a || b))
在这一点上,编译器不能可靠地确定你想要什么。你打算这样:
if (rslt == a || rslt == b)
或,你打算:
if ((rslt == 0 && a == 0 && b == 0) || (rslt == 1 && a == 1 && b == 1))
您可能会限制可用于此种语法中的类型,但此时你打桩什么理想应该是正交的语法顶部例外。这是怎么回事来迷惑用户和编译器复杂化。
这也迫使表达式来在不同的条件语句进行评价比在赋值语句。也就是说,也无疑将编译器复杂化。
这当然可以做的工作,但我认为,这将需要与重载符号新的语法,和所有有问题的增益。
在互动小说(文字冒险)创作语言通知使用“或”操作者支持它(不同于通常的逻辑或信息被写入“||”):
if (qty==2 or 3)
print "some";
else
print "many";
是否有这是为什么没有得到广泛支持的理由吗?
这有点特殊情况魔;目前还不清楚它做什么在什么其他,但简单的例子表达。
if (n or 8==m+(1 or 2) or 7) // plausible
if (qty<4 or 5) // huh?
a= "cat" or "dog" // er
在符号“如果(序列)值”可以在Python和其他现代脚本语言可能已经接管了这个利基现在好了。
在||
操作者是一个二进制运算符,它取两个操作数,并返回一个值。由于的方式表达在大多数主要语言的评估,这将是不可能的使用语法检查一个值等于一组值之一。这就是为什么它不是在大多数主要语言的支持。
这@ 1800信息发布,但是,是由许多语言支持的in
语法。如果不是在你的语言支持,你可以只创建一个名为in()
或in_array()
这需要两个参数,一个值和一个阵列功能,并返回true
如果数组包含该值。 (PHP,例如,具有一个内置的 in_array()函数。)
在Python中可以写这样
if(foobar in ('this', 'that', 'and something else'))
( '本', '那个', '和别的') - 这是一个列表类型
所以,我觉得在任何OOP语言,你可以创建自己的类:
MyClass(object):
List values
def in(value):
return search_value_in_values(value)
和写这样的:
if(new MyClass('this', 'that', 'and something else').in(foobar))