==和case之间的区别?
我是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。
它看起来像在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
"\""
啊,我正在使用MRI p136--也许是回归。 – Skilldrick 2011-04-05 12:06:21
红宝石1.9.2p136(2010-12-25修订版30365)[i686-linux]给出正确的输出 – steenslag 2011-04-05 13:26:37
有人可以提交错误报告吗? – 2011-04-05 23:38:59
case
使用triple-equal ===
operator来检查每种情况。
这么说,我不知道为什么你的例子不工作:
> c = "\""
> c == "\""
=> true
> c === "\""
=> true
尝试取出.each
并明确设置c
到引号字符,看看会发生什么。
通常,===
比Ruby中的==
更宽容,所以我无法想象==
会匹配而===
不会匹配的情况。
编辑:我刚才复制的代码,用相同的输入(与单"
字符的文件),并得到了以下的输出:
Quote
QuoteCase
Err
ErrCase
(最后两位是来自换行符在Vim坚持的文件末尾)。
如果我添加一个'c =“\”“if c ===”\“”'行到块的顶部,它按预期工作。另外,如果我对包含单引号字符的字符串执行与each_char相同的操作,而不是从文件读取,它将按预期工作。看起来像一个(相当基本的)错误。 – Fuz 2011-04-05 11:04:50
我刚刚试过这个,并没有问题 - 我不知道为什么你会得到这个错误。 – Skilldrick 2011-04-05 11:37:00
似乎是一个仅用于Windows的错误 – 2011-04-07 18:44:33
c的类型是什么?那么“\”“是什么类型的?”c ===“\”“'工作吗? – 2011-04-05 10:45:13
字符串,字符串和是,按此顺序。 – Fuz 2011-04-05 11:08:18
我冒昧地让代码更加Rubyish(所有反斜杠都让我的眼睛流血:-))并添加一些调试。 – 2011-04-05 11:30:01