"=="和"case"的区别是什么?"

6

我刚开始学习Ruby,尝试着写一个简单的解析器时,发现用==比较字符和用case表达式比较字符会产生不同的结果,这让我感到困惑。

File.open('Quote.txt') do |f|
  f.chars.each do |c|
    puts c == '"' ? 'Quote' : 'Err'

    puts case c
    when '"' then 'QuoteCase'
    else          'ErrCase'
    end

    p c == '"', c === '"', c
  end
end

假设Quote.txt是一个1字节大小的文件,其中只包含一个引号字符(0x22),那么这将产生以下结果:
Quote
ErrCase
true
true
"\""

我猜我做错了什么,但是我想不出来是什么。有人能帮忙吗?

顺便说一下,这是在Ruby 1.9.2中。


c 的类型是什么? "" 的类型是什么? c === "\"" 能行吗? - R. Martinho Fernandes
字符串,字符串,是的,按照这个顺序。 - Fuz
我冒昧地将代码变得更加Ruby风格(所有那些反斜杠让我的眼睛流血 :-) ),并添加了一些调试。 - Jörg W Mittag
@Jörg 你试过运行代码吗?我没有得到相同的输出 - 在我的机器上它按预期工作。 - Skilldrick
@Jörg 奇怪。你是如何创建你的测试文件的? - Skilldrick
显示剩余5条评论
2个回答

3

case 使用三等号运算符 === 检查每个 case。

话虽如此,我不知道为什么你的示例没有起作用:

> c = "\""
> c == "\""
=> true
> c === "\""
=> true

尝试删除 .each 并明确将 c 设置为引号字符,看看会发生什么。
通常情况下,在 Ruby 中,===== 更宽容,因此我无法想象出 == 会匹配而 === 不会匹配的情况。 编辑: 我刚刚复制了您的代码,并使用相同的输入(一个只包含一个 " 字符的文件),得到了以下输出:
Quote
QuoteCase
Err
ErrCase

(最后两个是由Vim坚持在文件末尾换行符引起的)。


如果我在代码块的顶部添加 c = "\"" if c === "\"" 一行,它会按预期工作。此外,如果我对包含单引号字符的字符串执行相同的操作,而不是从文件中读取,它也会按预期工作。看起来像是一个(相当基本的)错误。 - Fuz
我刚刚尝试了一下,没有遇到任何问题 - 我不确定为什么你会遇到这个错误。 - Skilldrick

2

看起来是YARV在Windows上的一个bug。我在JRuby 1.6.0中得到了正确的输出:

# ruby -v
ruby 1.9.2p180 (2011-02-18) [i386-mingw32]

# ruby test.rb
Quote
ErrCase
true
true
"\""

# jruby --1.9 -v
jruby 1.6.0 (ruby 1.9.2 patchlevel 136) (2011-03-15 f3b6154) (Java HotSpot(TM) Client VM 1.7.0-ea) [Windows XP-x86-java]

# jruby --1.9 test.rb
Quote
QuoteCase
true
true
"\""

啊,我正在使用 MRI p136 - 可能有回归问题。 - Skilldrick
ruby 1.9.2p136(2010-12-25修订版30365)[i686-linux]可以给出正确的输出。 - steenslag
有人可以提交一个错误报告吗? - Andrew Grimm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接