Как объявить константные переменные в 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].

Мне бы очень хотелось оказаться здесь не так.

Другие вопросы по тегам