我是Ruby的新手,我正在努力解决一些困扰我的问题。在编写一个简单的解析器时,我发现将char与==
进行比较会产生与将其与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中。
答案 0 :(得分:3)
case
使用triple-equal ===
operator检查每个案例。
那就是说,我不知道为什么你的例子不起作用:
> c = "\""
> c == "\""
=> true
> c === "\""
=> true
尝试删除.each
并明确将c
设置为引号字符,看看会发生什么。
通常情况下,===
比Ruby中的==
更宽容,因此我无法想象==
匹配且===
不匹配的情况。
编辑:我刚刚使用相同的输入(一个带有"
个字符的文件)复制了您的代码,并获得了以下输出:
Quote
QuoteCase
Err
ErrCase
(最后两个来自Vim坚持的文件末尾的换行符。)
答案 1 :(得分: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
"\""