Как объявить константные переменные в ruby /rails
Я хотел бы быть лучшим кодом... сделать мой код чище и более читабельным.
Одна вещь, которую я видел в c/ C++, это использование const для локальных переменных. Я думаю, что очень полезно сообщить читателю моего кода, что после установки переменной она не изменяется в функции / методе.
Мне интересно.... Есть ли способ указать, что локальная переменная является const?
#for example
sql = "select * from table1 where status = #{iStatusId}"
connection.execute(sql)
sql не изменится в этом методе. Могу ли я отметить это так?
Хорошо... это плохой пример, но я думаю, что точка зрения сделана... Я надеюсь:)
РЕДАКТИРОВАТЬ: я добавил немного динамического в sql.. бит iStatusId является параметром, передаваемым в метод.
EDIT2: я сделал Google это... все статьи говорят о замене магического числа. Это ежу понятно, и то, что я считаю MACRO. КОНТАНТЫ просты... я ищу const.. это очень разные вещи.
4 ответа
Было бы достаточно легко составить логику, которую вы описываете, используя что-то вроде этого:
class Thing
def unchangeable_attribute
@unchangeable_attribute
end
def unchangeable_attribute=(value)
raise SomeError if @unchangeable_attribute
@unchangeable_attribute = value
end
end
Однако я склонен согласиться с Дейвом Ньютоном, поскольку мне трудно представить себе отличный вариант использования чего-то подобного...
Что насчет obj.freeze
метод, определенный на объектах Ruby? Из документов:
Предотвращает дальнейшие модификации объекта. RuntimeError будет вызван, если попытка модификации будет предпринята. Нет возможности разморозить замороженный объект.
Константы просто начинаются с заглавной буквы, поэтому следующее будет отлично работать:
MY_CONSTANT = 1234
Однако перезапись константы возможна, хотя она выдаст предупреждение.
Конст в рубине не совсем логичен. Поскольку "все" переменные на самом деле являются просто замаскированными указателями на объекты, приведение их к c-парадигме const не имеет смысла.
Это будет равно const void * value = 'bla';
Вы все еще можете изменить значение [1].
Мне бы очень хотелось оказаться здесь не так.