Ruby 为什么这个代码段会输出;“真的”;它应该在什么时候返回;假;?

Ruby 为什么这个代码段会输出;“真的”;它应该在什么时候返回;假;?,ruby,Ruby,在博客中找到此代码段。手动跟踪代码会导致错误,但为什么在运行时输出为真 我现在没有看到的部分只是没有在我脑海中闪过。请帮助我更好地理解Ruby。允许的是不允许的;你有两个不同的变量。具体来说,第一个字母是不同的:第一个变量有“拉丁字母A”(U+0061),第二个变量有“西里尔字母A”(U+0430)。在大多数(所有?)字体中,字形要么相似,要么相同。因此,您的代码相当于: ALLOWED_TARGETS = ["dresden", "paris", "vienna"] def missile_

在博客中找到此代码段。手动跟踪代码会导致
错误
,但为什么在运行时输出为真


我现在没有看到的部分只是没有在我脑海中闪过。请帮助我更好地理解Ruby。

允许的
是不允许的;你有两个不同的变量。具体来说,第一个字母是不同的:第一个变量有“拉丁字母A”(U+0061),第二个变量有“西里尔字母A”(U+0430)。在大多数(所有?)字体中,字形要么相似,要么相同。因此,您的代码相当于:

ALLOWED_TARGETS = ["dresden", "paris", "vienna"]

def missile_launch_allowed(target, secret_key)
  allowed = true
  аllowed = false if secret_key != 1234
  allowed = false unless ALLOWED_TARGETS.include?(target)
  allowed
end

puts(missile_launch_allowed("dresden", 9999))

由于变量更名更加合理,应该很清楚为什么会得到这样的结果。

啊,我讨厌这些问题:)啊,这是有道理的。谢谢可怜那些在采访中被问到这些问题的人:)一方面,我想扼杀那些在采访中提出诡计问题的人。另一方面,我记得我帮助一位同学(几年前,用FORTRAN)找到了一个一小时都找不到的错误的原因;它类似于
X=A[O]
(其中
A[0]
)。Glyph等价性在今天比ASCII中更具潜在问题(尽管我认为在实际操作中不是),您仍然可以在野外看到它,并且应该知道如何调试它。合适的术语似乎是@SyedAslam“在编程语言面试中,您究竟在测试什么样的问题?”–您如何处理调试一个奇怪的问题?或者,看看你是否能“跳出框框”思考。“在博客中找到了这个代码片段”——在博客帖子中,这个bug是故意引入的,是为了绕过密钥检查吗?:-)博客post@Viktor谢谢你的链接。似乎OP忽略了代码下面的解释。“是不是故意引入这个bug来规避密钥检查?”这是一个有趣的想法though@Stefan是的,在阅读解释这一点的部分之前,我很好奇并尝试了一下。事实上,很好,我没有完整阅读。在答案和你发布的链接中,我学到了一些东西。同时,意识到“警告出现在咒语之后”:
ALLOWED_TARGETS = ["dresden", "paris", "vienna"]

def missile_launch_allowed(target, secret_key)
  first = true
  second = false if secret_key != 1234
  first = false unless ALLOWED_TARGETS.include?(target)
  first
end

puts(missile_launch_allowed("dresden", 9999))