Библиотека knigago >> Компьютеры и Интернет >> Учебники и самоучители по компьютеру >> Ruby - новые грани

Евгений Охотников - Ruby - новые грани

Ruby - новые грани
Книга - Ruby - новые грани.  Евгений Охотников  - прочитать полностью в библиотеке КнигаГо
Название:
Ruby - новые грани
Евгений Охотников

Жанр:

Учебники и самоучители по компьютеру, Современные российские издания, Литература ХXI века (эпоха Глобализации экономики), Программирование: прочее, Ruby

Изадано в серии:

неизвестно

Издательство:

RSDN Magazine

Год издания:

ISBN:

неизвестно

Отзывы:

Комментировать

Рейтинг:

Поделись книгой с друзьями!

Помощь сайту: донат на оплату сервера

Краткое содержание книги "Ruby - новые грани"

Когда некоторое время назад я выбрал Ruby для реализации одной конкретной и не очень сложной задачи, то мне не удалось оценить основные грани Ruby в полной мере. Блоки кода. Необязательные скобки. Удобство использования attr_reader/attr_accessor. Наличие method_missing. Пожалуй, и все.

Читаем онлайн "Ruby - новые грани". [Страница - 5]

постфиксный if, puts отрабатывает только если f != nil
puts "Found: #{f}" if f
# постфиксный unless, присваивание выполняется только если f == nil
f = SomeData.new unless f

8

Без таких операторов вполне можно было бы обойтись:

f = some_data.find(pattern)
if !f
# Выполняется только если f == nil.
...
end
if f
puts "Found: #{f}"
end
if !f
f = SomeData.new
end
но в простых случаях отказ от использования постфиксных условных операторов увеличивает объем
кода, поэтому часто постфиксные операторы оказываются очень удобными. К сожалению, при
злоупотреблении ими программа быстро утрачивает читабельность, поэтому пользоваться
постфиксными конструкциями нужно осторожно.

4.3 Структура программы и поиск модулей
Программа в Ruby — это текстовый файл, инструкции которого выполняются последовательно от
начала до конца файла. Нет какой-либо специально выделенной точки входа в программу (функции
main() как в C/C++ или статического метода main() как в Java). Например, в следующем случае:

a = ’Hello, ’
b = ’World’
puts a
puts b
def concatenate(s1, s2)
s1 + s2
end
puts concatenate(a, b)
Ruby сначала выполнит присваивание a и b, потом оттранслирует функцию concatenate и лишь
затем выполнит ее вызов.
Этот обычный для интерпретаторов способ работы налагает на программиста некоторые
ограничения. Например, при обработке исходного файла Ruby выполняет только элементарные
проверки во время трансляции кода во внутреннее представление. Из-за этого перед исполнением
программы может быть диагностирована только небольшая часть ошибок. Например, если функция
concatenate содержит явную синтаксическую ошибку:

def concatenate(s1, s2)
s1 +
end
то Ruby сможет ее диагностировать еще до выполнения первых инструкций:

> ruby prj_struct_sample_1-err.rb
prj_struct_sample_1-err.rb:9: syntax error
prj_struct_sample_1-err.rb:11: syntax error

9

Но если вместо явной синтаксической ошибки будет всего лишь опечатка в имени параметра:

def concatenate(s1, s2)
s1 + s3
end
то такая ошибка будет обнаружена только во время первого вызова concatenate:

> ruby prj_struct_sample_1-err.rb
Hello,
World
prj_struct_sample_1-err.rb:8:in ‘concatenate’: undefined local variable or
method ‘s3’ for main:Object (NameError)
from prj_struct_sample_1-err.rb:11
Более-менее крупные программы не следует размещать в одном большом исходном файле. Гораздо
удобнее разделить код на несколько исходных файлов и подключать их по мере надобности. В Ruby
подключение исходного файла выполняется с помощью метода require:

require ’fileutils’
Это аналог инструкции import из Java. Метод require ищет файл с расширением ‘.rb’ и, если находит,
то загружает его. Если .rb-файл не найден, то require пытается найти и загрузить динамически
загружаемую библиотеку с учетом особенностей именования на целевой операционной системе
(например, ‘fileutils.dll’ под Windows и ‘libfileutils.so’ под Unix). Если динамическая библиотека
найдена, она загружается как расширение (предполагается, что она содержит код Ruby
классов/методов, реализованных на C).
Метод require ищет файл в своих стандартных путях для поиска файлов, а если это не удалось — в
текущем каталоге. Глобальная переменная $: содержит список имен каталогов, в которых Ruby
будет осуществлять поиск подгружаемых модулей:

> ruby -e ’puts $:’
c:/ruby/lib/ruby/site_ruby/1.8
c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt
c:/ruby/lib/ruby/site_ruby
c:/ruby/lib/ruby/1.8
c:/ruby/lib/ruby/1.8/i386-mswin32
.
Повлиять на этот список можно с помощью переменной среды RUBYLIB и аргумента командной
строки ‘-I’:

> set RUBYLIB=my-path
> ruby -I another-path -e ’puts $:’
another-path
my-path
c:/ruby/lib/ruby/site_ruby/1.8
c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt
c:/ruby/lib/ruby/site_ruby
c:/ruby/lib/ruby/1.8
c:/ruby/lib/ruby/1.8/i386-mswin32
.
Управлять путями поиска модулей в Ruby приходится, если написанная на Ruby программа
находится в каком-то нестандартном для Ruby каталоге. Например, пусть на Ruby написан какой-то
инструмент и размещен в своем собственном каталоге, но вызывать его приходится из других
каталогов. Тогда приходится писать либо вот так:

> ruby -I some/usefull/tool some/usefull/tool/main.rb

10

либо устанавливать переменную среды RUBYLIB:

> set RUBYLIB=some/usefull/tool
> ruby some/usefull/tool/main.rb
Но есть и более удобный способ решения вопроса о поиске файлов, загружаемых через метод
require. Он основан на том, что Ruby использует глобальную переменную $: для перечисления имен
каталогов, в которых будет осуществляться поиск. А раз это переменная, ее можно изменить:

> ruby -e ’$:.unshift("yet-another-path"); puts $:’
yet-another-path
c:/ruby/lib/ruby/site_ruby/1.8
c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt
c:/ruby/lib/ruby/site_ruby
c:/ruby/lib/ruby/1.8
c:/ruby/lib/ruby/1.8/i386-mswin32
.
т.е. процессом поиска частей программы можно управлять --">

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


Ваш e-mail является приватным и не будет опубликован в комментарии.