Разница между == и регистром? - PullRequest
6 голосов
/ 05 апреля 2011

Я новичок в 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 - это 1-байтовый файл, содержащий символ одинарной кавычки (0x22), то получится:

Quote
ErrCase
true
true
"\""

Я предполагаю, что сделал что-то не так, но не могу понять, что это. Кто-нибудь может помочь?

Кстати, это в Ruby 1.9.2.

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

case использует оператор тройного равенства === для проверки каждого случая.

Тем не менее, я не знаю, почему ваш пример не работает:

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

Попробуйте удалить .each и явно установить c для символа кавычки и посмотрите, что произойдет.

Как правило, === более простителен, чем == в Ruby,Я не могу представить себе случай, когда == соответствовал бы, а === - нет.

Редактировать: Я только что скопировал ваш код с тем же вводом (файлс одним " символом) и получил следующий вывод:

Quote
QuoteCase
Err
ErrCase

(последние два от новой строки в конце файла, на котором настаивает Vim).

2 голосов
/ 05 апреля 2011

Похоже, ошибка в YARV на Windows. Я получаю правильный вывод в 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
"\""
...