Проверка синтаксиса или «компиляция» приложения Ruby on Rails

StackOverflow https://stackoverflow.com/questions/1104291

Вопрос

Я новичок в Ruby и недавно столкнулся с проблемой сравнения значений при создании приложения Ruby on Rails.В контроллере у меня было следующее утверждение, которое всегда возвращало false:

if (user.id != params[:id])

Проблема заключалась в том, что user.id (активная запись) является целым числом, а params[:id] — строкой.Мне потребовалось некоторое время, чтобы понять это, и я наконец изменил его на:

if (user.id != params[:id].to_i)

Теперь оператор работает так, как ожидалось.

Чтобы избежать этой ошибки в будущем, есть ли способ «скомпилировать» или заставить Ruby предупреждать вас, если вы попытаетесь сравнить два разных типа?Некоторые другие проблемы, с которыми я столкнулся, и которые я хотел бы «скомпилировать проверку», следующие:

  • Предупредите меня, если я создам переменную, но не использую ее.Чтобы помочь проверить опечатки в именах переменных.
  • Убедитесь, что метод существует в классе, чтобы я мог избежать опечаток в имени метода, а также помочь в рефакторинге, например, если я переименую метод.

В настоящее время я использую Ruby 1.8.6-27 RC2 с Rails 2.3.2 и RadRails IDE в Windows.

Это было полезно?

Решение 6

Лучшим решением, которое я нашел, была IDE, которая выполняла оперативную проверку синтаксиса, например RubyMine.Я не уверен, что это решило бы мою первоначальную проблему, но помогло мне найти и исправить несколько других ошибок синтаксиса и компиляции.Спасибо всем за ваши предложения.

Другие советы

Сначала тестируйте, потом кодируйте.Если вы пишете тесты, охватывающие все ветви вашего приложения, вы получаете уверенность в том, что ваш код работает и дает правильные результаты.

РЕДАКТИРОВАТЬ:Следует отметить, что возможность сравнивать два типа, не зависеть до последней секунды от названий методов и т.д.являются основными функциями Ruby.

Вы не столько вызываете метод, сколько отправляете сообщение объекту.Затем объект отвечает за выяснение того, как обращаться с методом.В Rails это используется для доступа к столбцам БД в ActiveRecord.Для столбцов не существует методов, пока объекту не будет отправлено сообщение с именем столбца.

Статическая типизация в Ruby противоречит системе утиной типизации.Часто можно получить полиморфизм бесплатно, не беспокоясь о сложных схемах наследования/интерфейса.

Я предлагаю использовать эти функции и компенсировать неопределенность путем тестирования.

Ruby не позволяет переопределить оператор == для Object.В Ruby 1.8 это невозможно, Ruby 1.9 должен был работать, но мне не удалось заставить мой скрипт работать с основными классами.Это хорошо работает для пользовательских объектов.

class Object

  alias :equal_without_warning :==

  def ==(object)
    unless self.class == object.class
      warn("Comparing `#{self.class}' with `#{object.class}'")
    end
    equal_without_warning(object)
  end

end

Предполагая, что я не допустил какой-то глупой ошибки в кодировании, ответ НЕТ:вы не можете проверить, сравниваете ли вы разные типы объектов.

Кроме того, я бы сказал, что нет.На самом деле Ruby не предназначен для такой работы, это скорее подход Java, а не стиль Ruby.

Руби не должна быть в безопасности.Он позволяет сравнивать любые два объекта, и в этом заключается большая часть его силы.Rails были бы невозможны без такого динамичного дизайна.

Даже компилируемый язык, такой как Java или C, не помешает вам выполнить == для двух объектов.Как сказал Бен, лучше сначала протестировать.Осмотрите структуры, с которыми вы работаете.Один из способов получить информацию об объекте Ruby — использовать:

puts object.class

В общем, лучший способ (который я знаю) избежать проблем такого типа для динамических/скриптовых языков – это переместить «логику» в методы/команды и написать для них модульные тесты.По сути, все, что может выйти из строя, должно быть протестировано.Код на странице должен быть тупой логикой...вместо того, чтобы отображать только те элементы, которые соответствуют определенным критериям, он должен отображать все элементы и получать этот список элементов из метода, который возвращает только те элементы, которые должны отображаться.

Две вещи, которые я бы предложил:

Один:Прочтите IRB (или скрипт/консоль для рельсов).Обычная практика разработки динамических языков — опробовать фрагменты кода внутри «живого» интерпретатора (например, IRB или консоли Rails).Эта практика восходит к самым ранним динамическим языкам, таким как Smalltalk и Lisp.Ruby-debug также очень полезен для устранения неполадок и может быть очень простым способом выяснить ошибку в вашем примере.

Два:Прочтите статью «Утиное печатание».«Типы» и переменные работают в Ruby немного иначе, чем многие ожидают.Насколько я понимаю, переменная типа user.id не имеет «типа».Значение указал на by user.id имеет тип, но сама переменная — нет.Я считаю, что это одна из причин, почему не существует инструмента, который мог бы сообщить вам о вашей ошибке до запуска программы.Сравнение этих двух переменных не является ошибкой, поскольку у переменных нет типа.user.id указывал на целое число в этом месте вашей программы, но было бы совершенно законно присвоить user.id указатель на строку, и в этот момент такое сравнение имело бы гораздо больше смысла.:-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top