在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?

请每个回答只回答一个特征。


当前回答

我想说的是,Python的空白是我最棒的WTF特性。的确,你或多或少会在一段时间后习惯它,而且现代编辑器使它更容易处理,但即使在过去一年里我几乎全职从事python开发,我仍然相信这是一个坏主意。我已经阅读了所有背后的原因,但说实话,它妨碍了我的工作效率。差不了太多,但鞍下还是有毛刺。

编辑:从评论来看,有些人似乎认为我不喜欢缩进我的代码。这是一个不正确的评估。无论使用什么语言,无论是否被迫,我总是将代码缩进。我不喜欢的是,缩进定义了一行代码所在的块。我更喜欢使用显式分隔符。除其他原因外,我发现显式分隔符更容易剪切和粘贴代码。

例如,如果我有一个缩进4个空格的块,并将它粘贴到一个缩进8个空格的块的末尾,我的编辑器(所有编辑器?)不知道粘贴的代码是属于8个空格的块还是外部块。OTOH,如果我有显式分隔符,很明显,代码属于哪个块以及它应该如何(重新)缩进——它通过智能地寻找块分隔符来做到这一点。

编辑2:一些提供评论的人似乎认为这是一个我讨厌的功能,或者我认为这使得python成为一种糟糕的语言。同样,这不是真的。虽然我不太喜欢它,但这不是重点。这个问题是关于最奇怪的语言特征,我认为这很奇怪,因为它是非常非常少(但是>0)语言使用的东西。

其他回答

在PHP中,字符串字母不能像在C中那样使用,你需要使用ord()和chr()来将数字转换为字符,反之亦然:"a" != 97,但ord("a") == 97。

不过,有一个例外:

for ($i = 'a'; $i < 'z'; $i++) {
    print "$i ";
}

将打印字母a到y,就像你所期望的,就像它是C风格的数据类型一样。

但是,如果将测试条件更改为<=,它将不会像您想象的那样输出a到z,而是输出a到yz!(共打印676项)

同样,如果您将676项列表中“z”后面的“z”更改为“aa”,并再次将测试条件更改为<,您将只看到“a”被打印出来!不是像你想的那样从a到z。

如果你将增量变量改为$i+=2,它将再次只打印“a”!唯一的方法是按顺序使用$i++, $i++,现在它像预期的那样工作。

尽管如此,这是PHP中输出字母a-z组合的好方法,尽管实际使用起来非常困难。

在Common Lisp中,零维数组是很奇怪的,而且很自然地,它们具有读取语法。

? (aref #0A5)
5

Oracle有几个SQL WTF问题。

Oracle将空字符串处理为null。 在“<>”比较中处理空值。 创建表WTF(键数为主键,动物varchar2(10)); 插入WTF值(1,'dog'); Insert into WTF values (2, "); Insert into WTF values (3,'cat'); Select * from WTF where animal <> 'cat';

唯一返回的行是(1,'dog')行。

Python 2。X演示了一个糟糕的列表理解实现:

z = 4
s = [z*z for z in range(255)]
print z

这段代码返回254。列表推导式的变量与上定义的变量冲突。

Python 3。x已经处理了这个特性,但是闭包仍然对外部变量使用动态链接,并在函数式python编程器中引入了许多wtf

def mapper(x):
    return x*x
continuations = [lambda: mapper(x) for x in range(5)]
print( [c() for c in continuations])

此代码显然返回[16,16,16,16,16]。

在Java中(这是一个导致赋值的if语句)

result = (Boolean condition) ? (if Boolean is true) : (if Boolean is false);

or

data Nat = Z|S Nat deriving Show
nattoInt Z = 0
nattoInt (S a) = 1 + nattoInt a

buildNat 0 = Z
buildNat a  =  S (buildNat (a - 1))

在Haskell…我仍然不太明白这是如何定义自然数的(我完全理解理论:-p)