2009-04-20 3 views
1

Я изучаю Ruby в свое свободное время, и у меня есть вопрос о языковых конструкциях для констант. Имеет ли Ruby эквивалент ключевого слова C++ const, чтобы переменные не изменялись? Вот пример кода:Ruby Эквивалент C++ Const?

first_line = f.gets().chomp() 
column_count = first_line.split(%r{\s+}).size() 
print column_count, "\n" 

Я хотел бы объявить COLUMN_COUNT быть константной, потому что я использую его ниже в моей программе, и я действительно не хочу, чтобы изменить его по ошибке. Предоставляет ли Ruby конструкцию языка для этого, или я должен просто отсосать ее и понять, что мои переменные всегда изменяемы?

Ответ на комментарий:

"Наиболее вероятная причина„случайной“перезапись переменных, я предполагаю, длинные блоки кода. Я согласен с духом вашей точки зрения, но не согласен с этим письмом. Ваш вопрос об избежании длинных блоков кода и ненужном состоянии является хорошим, но для констант также может быть полезно при описании дизайна кода внутри реализации. Большая часть значения const в моем коде исходит из аннотации, какие переменные мне ДОЛЖНЫ меняться, и которые я не должен, так что я не соблазню изменить их, если я вернусь к своему коду в следующем году. Это то же мнение, что предполагает, что код, который использует короткие комментарии из-за хороших имен переменных и четких отступов, лучше, чем неловко написанный код, объясненный подробными комментариями.

Другим вариантом является метод #freeze Ruby, который мне тоже нравится. Спасибо за ответы всем.

+0

быстрый google раскрывает http://rubylearning.com/satishtalim/ruby_constants.html – cobbal

ответ

3

Переменные, начинающиеся с заглавной буквы, являются константами в Ruby. Таким образом, вы можете изменить свой код на этот:

first_line = f.gets().chomp() 
Column_count = first_line.split(%r{\s+}).size() 
print Column_count, "\n" 

Теперь вы получите предупреждение, если вы пытаетесь изменить Column_count.

+0

Это круто. Есть ли способ сделать это предупреждение ошибкой? –

+0

Конвенция состоит в том, чтобы сделать константы все шапки, поэтому в этом случае COLUMN_COUNT. –

+1

Это не мешает вам изменить, какой объект назначен Column_count. Вы можете изменить внутреннее состояние объекта. Чтобы предотвратить это, используйте #freeze. – rampion

4

Ruby переменные в целом, ну, переменные.

Помимо ответа Джереми, в то время как он абсолютно точен, не ведет к рубиновому стилю, который очень «мейнстрим» или идиоматически звучит, и я бы не рекомендовал его для принятия. Ruby не работает как C++ и, как правило, не очень подходит для вещей, для которых лучше всего используется C++. Операционные системы, текстовые процессоры, такие вещи.

Наиболее вероятной причиной «случайной» перезаписи переменных является, я думаю, длинные блоки кода. В конце концов, если вы измените значение переменной в пятистрочном методе, это будет довольно очевидно! Если вы обычно пишете блоки кода дольше, чем, скажем, 10 строк, то эти куски, вероятно, делают слишком много вещей, и я настоятельно рекомендую вам приложить усилия, чтобы разбить их (увеличьте cohesion). Локализовать переменные как можно больше, чтобы минимизировать вероятность неожиданных побочных эффектов (уменьшить coupling).

4

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

 Смежные вопросы

  • Нет связанных вопросов^_^