2011-04-05 324 views
6

我是Ruby的新手,想努力工作,这让我感到困惑。在写一个简单的解析器,我发现,具有==比较炭会产生不同的结果比用case表达比较:==和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。

+0

c的类型是什么?那么“\”“是什么类型的?”c ===“\”“'工作吗? – 2011-04-05 10:45:13

+0

字符串,字符串和是,按此顺序。 – Fuz 2011-04-05 11:08:18

+0

我冒昧地让代码更加Rubyish(所有反斜杠都让我的眼睛流血:-))并添加一些调试。 – 2011-04-05 11:30:01

回答

2

它看起来像在Windows上的YARV中的错误。我在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 
"\"" 
+0

啊,我正在使用MRI p136--也许是回归。 – Skilldrick 2011-04-05 12:06:21

+0

红宝石1.9.2p136(2010-12-25修订版30365)[i686-linux]给出正确的输出 – steenslag 2011-04-05 13:26:37

+0

有人可以提交错误报告吗? – 2011-04-05 23:38:59

3

case使用triple-equal === operator来检查每种情况。

这么说,我不知道为什么你的例子不工作:

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

尝试取出.each并明确设置c到引号字符,看看会发生什么。

通常,===比Ruby中的==更宽容,所以我无法想象==会匹配而===不会匹配的情况。

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

Quote 
QuoteCase 
Err 
ErrCase 

(最后两位是来自换行符在Vim坚持的文件末尾)。

+0

如果我添加一个'c =“\”“if c ===”\“”'行到块的顶部,它按预期工作。另外,如果我对包含单引号字符的字符串执行与each_char相同的操作,而不是从文件读取,它将按预期工作。看起来像一个(相当基本的)错误。 – Fuz 2011-04-05 11:04:50

+0

我刚刚试过这个,并没有问题 - 我不知道为什么你会得到这个错误。 – Skilldrick 2011-04-05 11:37:00

+0

似乎是一个仅用于Windows的错误 – 2011-04-07 18:44:33

相关问题