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

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

Жанры

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

=> "cello"

irb(main):002:0> 3*79

=> 237

irb(main):003:0> Dir.entries(".").size

=> 17

irb(main):004:0> rand

=> 0.850757389880155

irb(main):005:0> rand

=> 0.679879756672551

irb(main):006:0> defined? Foo

=> nil

irb(main):007:0> defined? Object

=> "constant"

irb(main):008:0> quit

$

Конечно, это больше, чем калькулятор. При желании можно ввести произвольный код на Ruby:

[hal@localhost ch21]$ irb

irb(main):001:0> require 'mathn'

=> true

irb(main):002:0> gen = Prime.new

=> #

При установке флага

– r
выполняется require, поэтому можно включать код из внешнего файла. Предположим, что вы написали такой файл:

# File: foo.rb

class MyClass

 attr_accessor :alpha, :beta

 def initialize(a, b)

@alpha, @beta = a, b

 end

end

obj1 = MyClass.new(23,34)

obj2 = MyClass.new("abc","xyz")

Тогда можно сделать следующее:

$ irb -rfoo

irb(main):001:0> obj = MyClass.new(88,99)

=> #

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

MyClass
) мы можем, это не относится к локальным переменным. Локальные переменные доступны только в самом файле,
require
(выполненное хоть внутри, хоть вне
irb
) доступа к ним не дает.

Новичков часто смущает информация, выводимая

irb
:

$ irb -rfoo

irb(main):001:0> puts "hello"

hello

=> nil

Позвольте, что тут делает

nil
? Разумеется, это значение, возвращенное методом
puts
.

Еще один источник недоразумений — метод

eval
. Взгляните на следующий сеанс:

$ irb

irb (main) : 001:0> eval("var = 567")

=> 567

irb(main) :002:0> eval("var")

=> 567

irb(main):003:0> var

=> 567

Вас ничего не удивляет? Но давайте запустим следующий сценарий и посмотрим, что произойдет:

р eval("var = 567")

р eval("var")

р var

# Results:

# 567

# 567

# temp.rb:3: undefined local variable or method 'var' for main:Object

# (NameError)

У Ruby есть такая особенность: когда вы выполняете

eval
, а вслед за ним еще один, они в некотором смысле разделяют «общую область видимости». Поэтому к переменной, определенной в первой строке, можно обратиться во второй (вне или внутри
irb
). Но различие проявляется, когда мы попытаемся обратиться к той же переменной без использования
eval
. В
irb
это работает, а в сценарии мы получаем ошибку. Что происходит?

Поведение сценария следует считать более правильным. Не забывайте, что сама программа

irb
написана на Ruby; здравый смысл подсказывает, что она, скорее всего, внутри вызывает
eval
. Но мы только что убедились, что результат применения
eval
может отличаться от того, что мы видим на верхнем уровне, поэтому исполнение кода внутри
irb
не всегда идентично исполнению такого же кода в сценарии. Об этом не следует забывать, особенно если вы ставите какие-нибудь экзотические эксперименты.

Имейте в виду, что

irb
настраивается в широких пределах. При запуске она читает все инициализационные файлы, которые может найти, в следующем порядке:

• файл

~/.irbrc
;

• файл

.irbrc
;

• файл

irb.rс
;

• файл

_irbrc
;

• путь, указанный в переменной окружения

$irbrc
.

Инициализационные файлы пишутся на Ruby. В них можно настраивать текст приглашения и многое другое. Подробно эти файлы обсуждаются в книге «Programming Ruby». Ниже мы сделаем лишь несколько замечаний.

Если ваша версия Ruby собрана с поддержкой библиотеки GNU readline (обычно так и есть), то вы можете перемещаться по истории команд с помощью клавиш со стрелками вверх и вниз. Еще важнее, что работает механизм завершения по клавише Tab: когда вы набираете начало идентификатора, а затем нажимаете Tab,

irb
пытается дописать имя идентификатора за вас.

Чтобы включить механизм завершения, добавьте в файл

.irbrc
следующий фрагмент:

IRB.conf[:AUTO_INDENT] = true

IRB.сonf[:USE_READLINE] = true

IRB.conf[:LOAD_MODULES] ||= []

IRB.conf[:LOAD_MODULES] |= ['irb/completion']

В файле

.irbrc
может содержаться произвольный код. Например, я часто пользуюсь описанным ниже методом. Для краткости он назван
sm
(сокращение от «show methods»), а цель — вывести (в алфавитном порядке) список всех методов, которые можно вызывать для данного объекта, за исключением тех, которые он унаследовал от своих предков:

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

Черная метка

Лисина Александра
7. Гибрид
Фантастика:
технофэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черная метка

Три версты с гаком. Я спешу за счастьем

Козлов Вильям Федорович
Проза:
классическая проза
современная проза
5.00
рейтинг книги
Три версты с гаком. Я спешу за счастьем

Сирены

ван Ластбадер Эрик
Детективы:
триллеры
7.33
рейтинг книги
Сирены

Вожделеющее семя

Берджесс Энтони
Проза:
современная проза
6.43
рейтинг книги
Вожделеющее семя

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

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

Умри завтра

Джеймс Питер
5. Рой Грейс
Детективы:
триллеры
8.92
рейтинг книги
Умри завтра

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.42
рейтинг книги
Мятежник

Я не царь. Книга XXIV

Дрейк Сириус
24. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я не царь. Книга XXIV

Отцы-основатели. Весь Саймак - 7.Игра в цивилизацию

Саймак Клиффорд Дональд
7. Отцы-основатели. Весь Саймак
Фантастика:
научная фантастика
5.00
рейтинг книги
Отцы-основатели. Весь Саймак - 7.Игра в цивилизацию

Утерянные победы

фон Манштейн Эрих
След в истории
Документальная литература:
биографии и мемуары
5.75
рейтинг книги
Утерянные победы

Егерь. Сердце стаи. Книга 5

Скиба Николай
5. Зверолов
Фантастика:
рпг
фэнтези
фантастика: прочее
попаданцы
6.80
рейтинг книги
Егерь. Сердце стаи. Книга 5

Навигаторы Апокалипсиса

Шалыгин Вячеслав Владимирович
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
Навигаторы Апокалипсиса

Лэшер

Райс Энн
5. Мэйфейрские ведьмы
Фантастика:
ужасы и мистика
8.32
рейтинг книги
Лэшер

Наша навсегда

Зайцева Мария
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Наша навсегда