Эта глава посвящена некоторым практическим приемам.
Разделители выражений
В некоторых языках необходимо соблюдение некоторых правил пунктуации; часто используется точка с запятой (;), для обозначения окончания выражения в программе. 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 работает как если бы файл, на который он ссылается, был скопирован и помещен в текст программы вместо него (несто похожее на директиву препроцессора #include в C). require - несколько более сложная вещь, код загружается только один раз и только тогда, когда он реально нужен. Есть и другие отличия между load и require; их можно посмотреть в справочном руководстве или в FAQ.
Се ля ви...
Этого тьюториала должно быть достаточно, чтобы помочь вам начать писать программы на Ruby. Если возникают вопросы, Вы всегда можете порыться в справочном руководстве чтобы "углубить и расширить" ;-) свои познания . FAQ и справочник по библиотеке также являются важными ресурсами.
Удачи, и счастливого кодирования!
Источник: www.opennet.ru
К началу статьи