Evgenii Legotckoi
26 августа 2016 г. 13:56

User Guide #28 - Ruby - Фишки

Эта глава посвящена некоторым практическим приемам.

Разделители выражений

В некоторых языках необходимо соблюдение некоторых правил пунктуации; часто используется точка с запятой (

  1. ;
), для обозначения окончания выражения в программе.  Ruby вместо этого следует соглашениям, используемым в шеллах, таких как
  1. sh
или
  1. csh
.  Множественные выражения в одной строке должны разделяться точкой с запятой, но это не обязательно в конце строки; перевод строки трактуется как точка с запятой.  Если линия заканчивается обратным слэшем (
  1. \
), перевод строки игнорируется; это позволяет разнести длинный оператор на несколько строк.

Комментарии

Зачем писать комментарии?  Хотя хорошо написанный код имеет тенденцию к самодокументированию, часто бывает полезно делать заметки на полях; будет ошибкой думать, что другие смогут немедленно сказать что делает Ваш код лишь мельком взглянув на него (как это можете Вы). Кроме того, вы можете оказаться в роли этого другого человека всего лишь несколько дней спустя; кто из нас не возвращался спустя некоторое время к старой программе чтобы что-то дописать или исправить ее и не говорил "Я знаю, что это писал я. Но, черт побери, что вот это значит?"

Некоторые опытные программисты достаточно правильно заметят, что противоречивые и устаревшие комментарии могут быть хуже, чем их отсутствие. Безусловно, комментарии не могут быть заменой для читабельного кода; если Ваш код неясен, вероятно, он также содержит ошибки.  Может оказаться, что, пока Вы изучаете Ruby, Вы больше испытываете нужду в комментариях, а затем все меньше и меньше, по мере того, как Вы учитесь все лучше выражать свои идеи с помощью простого, элегантного, читабельного кода.


Ruby следует общепринятому в скриптах правилу, по которому начало комментария выделяется знаком фунта (

  1. #
).  Все, что следует за ним, интерпретатором игнорируется.

Также, для облегчения написания больших комментариев, интерпретатор Ruby также игнорирует все, что заключено между строкой, начинающейся с "

  1. =begin
" и заканчивающейся на "
  1. =end
".

  1. #!/usr/local/bin/ruby
  2.  
  3. =begin
  4. **********************************************************************
  5.   This is a comment block, something you write for the benefit of
  6.   human readers (including yourself).  The interpreter ignores it.
  7.   There is no need for a '#' at the start of every line.
  8. **********************************************************************
  9. =end

Упорядочиваем код

Интерпретатор Ruby обрабатывает код по мере его чтения.  Нет ничего похожего на фазу компиляции; если что-то еще не было прочитано, значит, это просто неопределено.

  1.  
  2. # this results in an "undefined method" error:
  3.  
  4. print successor(3),"\n"
  5.  
  6. def successor(x)
  7.   x + 1
  8. end

Это не заставляет Вас, как может показаться на первый взгляд, располагать код в стиле "сверху-вниз".  Когда интерпретатор натыкается на определение метода, он может благополучно проглотить неопределенные ссылки, но к тому времени, когда метод будет вызван, все они должны быть определены:

  1.  
  2. # Conversion of fahrenheit to celsius, broken
  3. # down into two steps.
  4.  
  5. def f_to_c(f)
  6.   scale (f - 32.0)  # This is a forward reference, but it's okay.
  7. end
  8.  
  9. def scale(x)
  10.   x * 5.0 / 9.0
  11. end
  12.  
  13. printf "%.1f is a comfortable temperature.\n", f_to_c( 72.3 )

Хотя это может показаться менее удобным, чем то, к чему Вы, может быть, привыкли в Perl или Java, это накладывает меньшие ограничения, чем программирование на С без прототипов (что вынуждает Вас постоянно поддерживать частичную упорядоченность ссылок).  Размещение кода верхнего уровня внизу исходника работает всегда.  Но даже это не так досадно, как может сперва показаться.  Разумный и безболезненный способ обеспечить нужное Вам поведение - определить функцию

  1. main
в начале файла, а затем вызвать ее снизу.

  1.  
  2. #!/usr/local/bin/ruby
  3.  
  4. def main
  5.   # Put your top level code here...
  6. end
  7.  
  8. # ... put all your support code here, organized as you see fit ...
  9.  
  10. main # ... and start execution here.

Также может помочь то, что в Ruby есть утилиты, разбивающие сложную программу на читабельные, с возможностью повторного использования, логически взаимосвязанные куски.  Мы уже встречались с использованием

  1. include
для доступа к модулям.  Вы также сочтете полезным использование средств
  1. load
и
  1. require
.
  1. load
работает как если бы файл, на который он ссылается, был скопирован и помещен в текст программы вместо него (несто похожее на директиву препроцессора
  1. #include
в C).
  1. require
- несколько более сложная вещь, код загружается только один раз и только тогда, когда он реально нужен.  Есть и другие отличия между
  1. load
и
  1. require
;

Се ля ви...

Этого тьюториала должно быть достаточно, чтобы помочь вам начать писать программы на Ruby.  Если возникают вопросы, Вы всегда можете порыться в справочном руководстве чтобы "углубить и расширить" ;-) свои познания .

Удачи, и счастливого кодирования!

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь