Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

• Метод объекта

initialize
всегда является закрытым.

• Когда итератор заканчивается левой фигурной скобкой (или словом

end
) и возвращает значение, это значение можно использовать для вызова последующих методов, например:

squares = [1,2,3,4,5].collect do |x| x**2 end.reverse

# squares теперь равно [25,16,9,4,1]

• В конце программы на Ruby часто можно встретить идиому

if $0 == __FILE__

Таким образом проверяется, исполняется ли файл как автономный кусок кода (

true
) или как дополнительный, например библиотека (
false
). Типичное применение — поместить некую «главную программу» (обычно с тестовым кодом) в конец библиотеки.

• Обычное наследование (порождение подкласса) обозначается символом

<
:

class Dog < Animal

 # ...

end

Однако для создания синглетного класса (анонимного класса, который расширяет единственный экземпляр) применяется символ

<<
:

class << platypus

 # ...

end

• При передаче блока итератору есть тонкое различие между фигурными скобками (

{}
) и операторными скобками
do-end
. Связано оно с приоритетом:

mymethod param1, foobar do ... end

# Здесь do-end связано с mymethod.

mymethod param1, foobar { ... }

# А здесь {} связано с именем foobar, предполагается, что это метод.

• Традиционно в Ruby однострочные блоки заключают в фигурные скобки, а многострочные — в скобки do-end, например:

my_array.each { |x| puts x }

my_array.each do |x|

 print x

 if x % 2 == 0

puts " четно."

 else

puts " нечетно."

 end

end

Это необязательно и в некоторых случаях даже нежелательно.

• Помните, что строки (strings) в некотором смысле двулики: их можно рассматривать как последовательность символов или как последовательность строчек (lines). Кому-то покажется удивительным, что итератор

each
оперирует строками (здесь под «строкой» понимается группа символов, завершающаяся разделителем записей, который по умолчанию равен символу новой строки). У
each
есть синоним
each_line
. Если вы хотите перебирать символы, можете воспользоваться итератором
each_byte
. Итератор
sort
также оперирует строками. Для строк (strings) не существует итератора
each_index
из-за возникающей неоднозначности. Действительно, хотим ли мы обрабатывать строку посимвольно или построчно? Все это со временем войдет в привычку.

• Замыкание (closure) запоминает контекст, в котором было создано. Один из способов создать замыкание — использование объекта

Proc
. Например:

def power(exponent)

 proc {|base| base**exponent}

end

square = power(2)

cube = power(3)

a = square.call(11) # Результат равен 121.

b = square.call(5) # Результат равен 25.

с = cube.call(6) # Результат равен 216.

d = cube.call(8) # Результат равен 512.

Обратите внимание, что замыкание «знает» значение показателя степени, переданное ему в момент создания.

• Однако помните: в замыкании используется переменная, определенная во внешней области видимости (что вполне допустимо). Это свойство может оказаться полезным, но приведем пример неправильного использования:

$exponent = 0

def power

 proc {|base| base**$exponent}

end

$exponent = 2

square = power

$exponent = 3

cube = power

a = square.call(11) # Неверно! Результат равен 1331.

b = square.call(5) # Неверно! Результат равен 125.

# Оба результата неверны, поскольку используется ТЕКУЩЕЕ

# значение $exponent. Так было бы даже в том случае, когда

# используется локальная переменная, покинувшая область

# видимости (например, с помощью define_method).

с = cube.call(6) # Результат равен 216.

d = cube.call(8) # Результат равен 512.

• Напоследок рассмотрим несколько искусственный пример. Внутри блока итератора

times
создается новый контекст, так что
x
— локальная переменная. Переменная
closure
уже определена на верхнем уровне, поэтому для блока она не будет локальной.

closure = nil # Определим замыкание, чтобы его имя было известно.

1.times do # Создаем новый контекст.

 x = 5 # Переменная x локальная в этом блоке,

 closure = Proc.new { puts "В замыкании, x = #{x}" }

end

x = 1

# Определяем x на верхнем уровне.

closure.call # Печатается: В замыкании, x = 5

Поделиться:
Популярные книги

Все, что шевелится

Федотов Сергей
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все, что шевелится

Офицер Красной Армии

Поселягин Владимир Геннадьевич
2. Командир Красной Армии
Фантастика:
попаданцы
8.51
рейтинг книги
Офицер Красной Армии

Герой

Мазин Александр Владимирович
4. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Герой

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

#Бояръ-Аниме. Газлайтер. Том 37

Володин Григорий Григорьевич
37. История Телепата
Фантастика:
фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 37

Путь

Yagger Егор
Фантастика:
космическая фантастика
4.25
рейтинг книги
Путь

Звездная Кровь. Экзарх III

Рокотов Алексей
3. Экзарх
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Экзарх III

Звездная Кровь. Изгой VI

Елисеев Алексей Станиславович
6. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
технофэнтези
рпг
попаданцы
5.00
рейтинг книги
Звездная Кровь. Изгой VI

Законы Рода. Том 9

Мельник Андрей
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Беглый

Шимохин Дмитрий
2. Подкидыш [Шимохин]
Приключения:
прочие приключения
5.00
рейтинг книги
Беглый

Кодекс Охотника. Книга VIII

Винокуров Юрий
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII

Студиозус

Шмаков Алексей Семенович
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус

Личный аптекарь императора. Том 2

Карелин Сергей Витальевич
2. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Личный аптекарь императора. Том 2

Гримуар темного лорда II

Грехов Тимофей
2. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда II