English 中文(简体)
在任何主要语言中,编写`if (foobar == (“this” || “that”))`检查foobar是否等于“this”或“that”是否受支持?
原标题:
  • 时间:2009-03-14 04:22:22
  •  标签:

I have a faint memory of being able to write an if statement in some language like this:

if (foobar == ("this" || "that"))

Instead of:

if (foobar == "this" || foobar == "that")

The latter is more verbose, and therefore less aesthetically appealing to me.

Is the former convention supported in any major languages? Is there a reason why this isn t widely supported?

最佳回答

The Icon programming language has this feature.

Through the use of generators, you can do

if i = (0 | 1) then write("0 or 1")

which succeeds if i = 0 or i = 1. You can even do:

if (i | j | k) = (0 | 1) then write("0 or 1")

which succeeds if any of i, j, or k is equal to 0 or 1.

这背后的基本思想是,每个(1 | 2 | 3..)序列都创建一个生成器,该生成器将依次返回每个值,直到它耗尽值。当在这样的布尔情况下使用生成器时,值将被从生成器请求,直到比较成功。当你在比较的两侧组合两个生成器时,将尝试所有可能的组合,直到有一个成功。 (如果值不相等,等号运算符“失败”而不是返回false。)

问题回答

I seem to recall Pascal had an in statement as in:

if x in (foo, bar) then
  ...

As to why it is not more widely supported, beats me. It seems like a pretty nice piece of syntactic sugar.

我唯一记得使用那种句法的地方是在大约25年前的COBOL中。

我怀疑它没有得到广泛支持的原因是它会导致编译器无法解决的歧义。在您的特定情况下,这不是一个特定的问题,因为“this”和“that”是字符串,对于它们来说,条件OR运算符没有意义。但是考虑这个片段,在像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))

你可以限制这种语法可以使用的类型,但这将在理想情况下应该是正交语法上堆叠异常。这将会让用户感到困惑并且让编译器变得复杂。

这也会迫使表达式在条件语句和赋值语句中的求值方式有所不同。这同样无疑会使编译器更加复杂。

它肯定可以被制作出来,但我认为这将需要重载符号的新语法,并为了一个可疑的收益而付出所有代价。

互动小说(文本冒险)编写语言Inform支持“or”运算符(与通常写为“||”的逻辑或是不同的)。

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和其他现代脚本语言中提供的“if value in (sequence)”符号注释可能已经永久地占据了这个领域。

||运算符是一个二元运算符,它接受两个操作数并返回一个单一的值。由于大多数主流语言中表达式的求值方式,使用该语法检查一个值是否等于一组值是不可能的。这就是为什么大多数主流语言不支持它的原因。

然而,@1800 INFORMATION 发布的 in 语法被许多语言支持。 如果在您的语言中不支持它,您可以创建一个名为 in()in_array() 的函数,该函数接受两个参数:一个值和一个数组,并返回 true 如果数组包含该值。(例如,PHP拥有内置的in_array()函数。)

在Python中,您可以像这样编写

if(foobar in ( this ,  that ,  and something else ))

这个,那个,还有别的东西 - 这是一个列表类型。

因此,我认为在任何面向对象的语言中,您都可以创建自己的类:

MyClass(object):

  List values

  def in(value):
     return search_value_in_values(value)

请将此翻译成中文:然后写出以下内容: Original: "The sunflower is a beautiful plant with yellow petals and a brown center." Translation: "向日葵是一种美丽的植物,有黄色的花瓣和棕色的中心。" Something like this: "向日葵是一个让人心情澎湃的植物,每当它迎着阳光转向时,它那张明亮的面孔总会使你感到快乐。不仅如此,它也是一个重要的农作物,被用于生产葵花油和食用种子等多种用途。" (Translation: "The sunflower is a plant that inspires joy - as it turns its bright face towards the sun, your spirit is lifted. Not only that, it is also an important crop used for producing sunflower oil and edible seeds among other things.")

if(new MyClass( this ,  that ,  and something else ).in(foobar))




相关问题
热门标签