Эта глава посвящена некоторым практическим приемам.
Разделители выражений
В некоторых языках необходимо соблюдение некоторых правил пунктуации; часто используется точка с запятой (
), для обозначения окончания выражения в программе. Ruby вместо этого следует соглашениям, используемым в шеллах, таких как
- ;
или
- sh
. Множественные выражения в одной строке должны разделяться точкой с запятой, но это не обязательно в конце строки; перевод строки трактуется как точка с запятой. Если линия заканчивается обратным слэшем (
- csh
), перевод строки игнорируется; это позволяет разнести длинный оператор на несколько строк.
- \
Комментарии
Зачем писать комментарии? Хотя хорошо написанный код имеет тенденцию к самодокументированию, часто бывает полезно делать заметки на полях; будет ошибкой думать, что другие смогут немедленно сказать что делает Ваш код лишь мельком взглянув на него (как это можете Вы). Кроме того, вы можете оказаться в роли этого другого человека всего лишь несколько дней спустя; кто из нас не возвращался спустя некоторое время к старой программе чтобы что-то дописать или исправить ее и не говорил "Я знаю, что это писал я. Но, черт побери, что вот это значит?"
Некоторые опытные программисты достаточно правильно заметят, что противоречивые и устаревшие комментарии могут быть хуже, чем их отсутствие. Безусловно, комментарии не могут быть заменой для читабельного кода; если Ваш код неясен, вероятно, он также содержит ошибки. Может оказаться, что, пока Вы изучаете Ruby, Вы больше испытываете нужду в комментариях, а затем все меньше и меньше, по мере того, как Вы учитесь все лучше выражать свои идеи с помощью простого, элегантного, читабельного кода.
Ruby следует общепринятому в скриптах правилу, по которому начало комментария выделяется знаком фунта (
). Все, что следует за ним, интерпретатором игнорируется.
- #
Также, для облегчения написания больших комментариев, интерпретатор Ruby также игнорирует все, что заключено между строкой, начинающейся с "
" и заканчивающейся на "
- =begin
".
- =end
- #!/usr/local/bin/ruby
- =begin
- **********************************************************************
- This is a comment block, something you write for the benefit of
- human readers (including yourself). The interpreter ignores it.
- There is no need for a '#' at the start of every line.
- **********************************************************************
- =end
Упорядочиваем код
Интерпретатор Ruby обрабатывает код по мере его чтения. Нет ничего похожего на фазу компиляции; если что-то еще не было прочитано, значит, это просто неопределено.
- # this results in an "undefined method" error:
- print successor(3),"\n"
- def successor(x)
- x + 1
- end
Это не заставляет Вас, как может показаться на первый взгляд, располагать код в стиле "сверху-вниз". Когда интерпретатор натыкается на определение метода, он может благополучно проглотить неопределенные ссылки, но к тому времени, когда метод будет вызван, все они должны быть определены:
- # Conversion of fahrenheit to celsius, broken
- # down into two steps.
- def f_to_c(f)
- scale (f - 32.0) # This is a forward reference, but it's okay.
- end
- def scale(x)
- x * 5.0 / 9.0
- end
- printf "%.1f is a comfortable temperature.\n", f_to_c( 72.3 )
Хотя это может показаться менее удобным, чем то, к чему Вы, может быть, привыкли в Perl или Java, это накладывает меньшие ограничения, чем программирование на С без прототипов (что вынуждает Вас постоянно поддерживать частичную упорядоченность ссылок). Размещение кода верхнего уровня внизу исходника работает всегда. Но даже это не так досадно, как может сперва показаться. Разумный и безболезненный способ обеспечить нужное Вам поведение - определить функцию
в начале файла, а затем вызвать ее снизу.
- main
- #!/usr/local/bin/ruby
- def main
- # Put your top level code here...
- end
- # ... put all your support code here, organized as you see fit ...
- main # ... and start execution here.
Также может помочь то, что в Ruby есть утилиты, разбивающие сложную программу на читабельные, с возможностью повторного использования, логически взаимосвязанные куски. Мы уже встречались с использованием
для доступа к модулям. Вы также сочтете полезным использование средств
- include
и
- load
.
- require
работает как если бы файл, на который он ссылается, был скопирован и помещен в текст программы вместо него (несто похожее на директиву препроцессора
- load
в C).
- #include
- несколько более сложная вещь, код загружается только один раз и только тогда, когда он реально нужен. Есть и другие отличия между
- require
и
- load
;
- require
Се ля ви...
Этого тьюториала должно быть достаточно, чтобы помочь вам начать писать программы на Ruby. Если возникают вопросы, Вы всегда можете порыться в справочном руководстве чтобы "углубить и расширить" ;-) свои познания .
Удачи, и счастливого кодирования!