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

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

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

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

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

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

чтобы избежать этой ошибки в есть ли способ "скомпилировать" или заставить Ruby предупредить вас, если вы попытаетесь сравнить 2 разных типа? Некоторые другие проблемы, с которыми я столкнулся, я хотел бы "скомпилировать проверку":

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

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

6 ответов


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

EDIT:я должен отметить, что возможность сравнения двух типов не зависит от имен методов до последней секунды и т. д. являются основными особенностями Ruby.

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

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

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


Ruby не позволяет переопределить оператор == для объекта. В 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.


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

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

puts object.class

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


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

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

два: Читайте на "Duck Typing". "Типы" и переменные работают немного иначе в Ruby, чем многие ожидают от них. Как я понимаю, переменная типа user.id не имеет "типа". Значение указал на пользователем.id имеет тип, но сама переменная не имеет. Я считаю, что это часть того, почему нет инструмента, который сказал бы вам, что ваша ошибка была до запуска программы. Сравнение этих двух переменных не является ошибкой, потому что переменные не имеют тип. пользователь.id указывал на целое число в этой точке вашей программы, но было бы совершенно законно назначить пользователя.id, чтобы указать на строку, и в этот момент это сравнение имело бы гораздо больше смысла. :-)


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