==和case的区别



我是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是一个包含单个引号字符(0x22)的1字节文件,则产生:

Quote
ErrCase
true
true
"""

我认为我做错了什么,但我不知道是什么。有人能帮忙吗?

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

case使用三重相等的===运算符来检查每种情况。

那就是说,我不知道为什么你的例子不起作用:

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

尝试删除.each并显式地将c设置为引号字符,看看会发生什么。

一般来说,Ruby中的=====更宽容,所以我无法想象==匹配而===不匹配的情况。

编辑:我刚刚复制了您的代码,具有相同的输入(具有单个"字符的文件),并得到以下输出:

Quote
QuoteCase
Err
ErrCase

(后两个来自Vim坚持的文件末尾的换行符)。

这看起来像是windows上的YARV中的一个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
"""

相关内容

  • 没有找到相关文章

最新更新