2011-04-05 327 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

相關問題