Ruby: NoMethodError после обновления до ruby ​​1.9

Я знаю, что этот вопрос может показаться очень конкретным, но я пытаюсь обновить некоторые сценарии для работы на ruby ​​​​1.9 и неоднократно сталкивался с этой очень похожей ошибкой. Я пытаюсь запустить этот код здесь: http://x.gfax.ch/Archives/Scripts/boggle.rb, но застрял в:

def Dict.to_n(ch)
    ch[0]-'a'[0]
end

В ruby1.8 это генерирует случайную доску boggle NxN, затем находит и выводит все слова, которые он может найти в ней. Однако в ruby1.9 интерпретатор выдает мне следующее сообщение:

boggle.rb:182:in `to_n': undefined method `-' for "a":String (NoMethodError)

Что не так с моим синтаксисом? (Если вам нужен файл словаря для игры со сценарием, я использую тот, который приведен внизу этой страницы примера: http://learnruby.com/boggle/index.shtml) Заранее благодарим вас за любые указания.


person rubyuser1357796    schedule 23.05.2012    source источник
comment
ch[0] возвращает строку a, у которой нет метода -. Можете ли вы уточнить, что вы передаете в этот метод и что именно вы ожидаете?   -  person rfunduk    schedule 24.05.2012


Ответы (2)


Вы можете попробовать что-то вроде этого:

  def Dict.to_n(ch)
    if ch.respond_to? :codepoints #1.9+
      ch.codepoints.first - 'a'.codepoints.first
    else
      ch[0]-'a'[0]
    end
  end
person Mark Thomas    schedule 24.05.2012
comment
Большое спасибо! Я не знал, как еще передать персонажей. Теперь замените все array.to_s на .join, чтобы исправить вывод: P - person rubyuser1357796; 24.05.2012

В Ruby 1.9 метод String#[] возвращает строку, а в Ruby 1.8 возвращает числовое значение. (см. здесь). рассмотрите возможность использования String#chars вместо этого.

person jtbandes    schedule 23.05.2012
comment
chars по-прежнему возвращает массив строк длины один, codepoints , вероятно, правильно. - person Andrew Marshall; 24.05.2012