vi ~/.bash_profile
add
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`
Это говорит вашей целевой ссылке /usr/bin/java
использовать последний пакет Java 7, установленный в
/Library/Java/JavaVirtualMachines/
Таким образом, для JDK 1.7.0_17
JAVA_HOME
было бы:
/Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home
Примечание. В последнее время в этой области произошли значительные изменения. переместите Mac OS X из собственных пакетов Java компании Appels в пакеты Java на основе Oracle. Вышеупомянутое решение работает нормально с Mac OS X 10.8.2
Ruby doesn't allow you to redefine the == operator for Object. In ruby 1.8 you can't, Ruby 1.9 was supposed to do but I haven't been able to get my script working for core classes. It works well for custom defined objects.
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
Assuming I didn't do some stupid coding error, the answer is NO: you can't check whether you are comparing different type of objects.
Also, I would say you don't. Actually Ruby isn't designed to work in this way, this is more a java approach rather than Ruby style.
Я бы посоветовал две вещи:
Первый: прочтите IRB (или скрипт / консоль для рельсов). Обычная практика разработки на динамических языках - опробовать фрагменты кода внутри «живого» интерпретатора (например, IRB или консоли rails). Эта практика восходит к самым ранним динамическим языкам, таким как Smalltalk и Lisp. Ruby-debug также очень полезен для устранения неполадок и был бы очень простым способом выяснить ошибку в вашем примере.
Два: прочтите "Утиный ввод". «Типы» и переменные работают в Ruby несколько иначе, чем многие от них ожидают. Насколько я понимаю, такая переменная, как user.id, не имеет «типа». Значение , указанное user.id на , действительно имеет тип, но сама переменная - нет. Я полагаю, что' Это одна из причин, почему не существует инструмента, который бы сообщил вам, в чем была ваша ошибка, до запуска программы. Сравнение этих двух переменных не является ошибкой, потому что переменные не имеют типа. user.id указывал на целое число в этот момент в вашей программе, но было бы совершенно законно назначить user.id, чтобы он указывал на строку, после чего это сравнение имело бы намного больше смысла. : -)
Сначала проверьте, затем введите код. Если вы пишете тесты, которые охватывают все ветви вашего приложения, вы получаете уверенность в том, что ваш код работает и дает правильные результаты.
РЕДАКТИРОВАТЬ: Я должен указать, что возможность сравнивать два типа не зависит от имен методов до тех пор, пока последняя секунда и т. д. - это основные особенности Ruby.
Вы не столько вызываете метод, сколько отправляете сообщение объекту. Затем объект отвечает за выяснение того, как обрабатывать метод. В Rails это используется для доступа к столбцам БД в ActiveRecord. Для столбцов нет методов до тех пор, пока объекту не будет отправлено сообщение с именем столбца.
Статическая типизация в Ruby противоречит системе утиной печати. Часто полиморфизм можно получить бесплатно, не беспокоясь о сложных схемах наследования / интерфейса.
Руби не должна быть в безопасности. Он позволяет сравнивать любые два объекта, и именно в этом заключается его сила. Rails был бы невозможен без такого динамического дизайна.
Даже скомпилированный язык, такой как Java или C, не помешает вам выполнить == для двух объектов. Как сказал Бен, лучше сначала протестировать. Осмотрите конструкции, с которыми вы работаете. Один из способов получить информацию об объекте Ruby - использовать:
puts object.class
В общем, лучший способ (я знаю) избежать этого типа проблем для динамических языков / языков сценариев - это перенести «логику» в методы / команды и написать для них модульные тесты. По сути, все, что может дать сбой, следует проверять. Код на странице должен быть тупой логикой ... вместо того, чтобы отображать только те элементы, которые соответствуют определенным критериям, он должен отображать все элементы и получать этот список элементов из метода, который возвращает только те, которые должны отображаться.