6.1.4. Преобразование строки в символ и обратно
6.1.4. Преобразование строки в символ и обратно
Строки и символы можно преобразовывать друг в друга с помощью методов to_str и to_sym:
a = "foobar"
b = :foobar
a == b.to_str # true
b == a.to_sym # true
Для метапрограммирования иногда бывает полезен такой метод:
class Symbol
def +(other)
(self.to_s + other.to_s).to_sym
end
end
Он позволяет конкатенировать символы (или дописывать строку в конец символа). Ниже приведен пример использования; мы принимаем на входе символ и пытаемся определить, представляет ли он какой-нибудь метод доступа (то есть существует ли метод чтения или установки атрибута с таким именем):
class Object
def accessor?(sym)
return (self .respond_to?(sym) and self .respond_to?(sym+"="))
end
end
Упомяну также о более изощренном способе применения символов. Иногда при выполнении операции map нужно указать сложный блок. Однако во многих случаях мы просто вызываем некоторый метод для каждого элемента массива или набора:
list = words.map {|x| x.capitalize }
He кажется ли вам, что для такой простой задачи слишком много знаков препинания? Давайте вместо этого определим метод to_proc в классе Symbol. Он будет приводить любой символ к типу объекта proc. Но какой именно объект proc следует вернуть? Очевидно, соответствующий самому символу в контексте объекта; иными словами, такой, который пошлет сам символ в виде сообщения объекту.
def to_proc
proc {|obj, *args| obj.send(self, *args) }
end
Кстати, этот код заимствован из проекта Гэвина Синклера (Gavin Sinclair) «Расширения Ruby». Имея такой метод, мы можем следующим образом переписать первоначальный код:
list = words.map(&:capitalize)
Стоит потратить немного времени и разобраться, как это работает. Метод map обычно принимает только блок (никаких других параметров). Наличие знака & (амперсанд) позволяет передать объект proc вместо явно указанного блока. Поскольку мы применяем амперсанд к объекту, не являющемуся proc, то интерпретатор пытается вызвать метод to_proc этого объекта. Получающийся в результате объект proc подставляется вместо явного блока, чтобы метод map вызывал его для каждого элемента массива. А зачем передавать self в виде сообщения элементу массива? Затем, что объект proc является замыканием и, следовательно, помнит контекст, в котором был создан. А в момент создания self был ссылкой на символ, для которого вызывался метод to_proc.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Символ-разделитель
Символ-разделитель Пример XML-документа, с которым мы до сих пор работали, выровнен так, чтобы показать иерархическую структуру его элементов:<?xml version="1.0"?> <library> <book> <title> Earthquakes for Lunch </title> <title> Volcanoes for Dinner </title> </book></library>Однако, с
Как посылать письма в Интернет/Релком и обратно.
Как посылать письма в Интернет/Релком и обратно. Во-первых, Вам необходимо узнать адрес близлежащего к Вам гейта в интернет. Для Москвы это 2:50/128. Для большинства городов этот адрес будет тот же, с учетом того, что адрес этот обычно фиктивный. Далее Вы посылаете письмо с
6.12. CD-ROM постоянно сбрасывается в PIO режим, и не хочет выставляться обратно в UDMA.
6.12. CD-ROM постоянно сбрасывается в PIO режим, и не хочет выставляться обратно в UDMA. Это происходит если XP обнаруживает, что устройство не стабильно работает в выбранном для него режиме. Определяется это по количеству ошибок чтения, получаемых с привода. Обычно это означает
Переносим образ диска обратно на винчестер
Переносим образ диска обратно на винчестер Ну а теперь представим себе самый страшный кошмар — вышел из строя наш винчестер, и операционка никак не хочет грузиться. Или другой вариант — после активной работы в Интернете мы никак не можем опять к нему подключиться — не
Миграция баз данных на Yaffil и обратно
Миграция баз данных на Yaffil и обратно При разработке сервера Yaffil большое внимание было уделено безболезненному переходу со всех версий линейки InterBase, начиная с версии 4.0. Это вызвано тем, что в настоящее время существует большое число инсталляций устаревших версий (4.2, 5.6)
2.15. Преобразование символов в коды ASCII и обратно
2.15. Преобразование символов в коды ASCII и обратно В Ruby символ представляется целым числом. Это поведение изменится в версии 2.0, а возможно и раньше. В будущем предполагается хранить символы в виде односимвольных строк.str = "Martin"print str[0] # 77Если в конец строки дописывается
2.24. Преобразование строки в число (десятичное или иное)
2.24. Преобразование строки в число (десятичное или иное) Есть два основных способа преобразовать строку в число: методы Integer и Float модуля Kernel и методы to_i и to_f класса String. (Имена, начинающиеся с прописной буквы, например Integer, обычно резервируются для специальных функций
3.2. Преобразование чисел в строки
3.2. Преобразование чисел в строки ПроблемаИмеются числовые типы (int, float), и вам требуется поместить их содержимое в string, возможно, предварительно отформатировав.РешениеДля выполнения этого имеется множество способов, каждый из которых имеет свои достоинства и недостатки.
4.12. Преобразование строки к нижнему или верхнему регистру
4.12. Преобразование строки к нижнему или верхнему регистру ПроблемаИмеется строка, которую требуется преобразовать к нижнему или верхнему регистру.РешениеДля преобразования символов к нижнему или верхнему регистру используйте функции toupper и tolower из заголовочного файла
Символ терминатора
Символ терминатора Терминатором оператора по умолчанию является точка с запятой (;), которая используется во всех примерах в этой главе. Вы можете изменить этот терминатор любым другим символом или группой символов посредством команды SET TERM[INATOR]. Например, чтобы заменить
Переход на Windows Vista, или… Туда и обратно
Переход на Windows Vista, или… Туда и обратно Думаю, повторять многочисленные отрицательные отзывы о Windows Vista нет смысла – и в электронных изданиях, и в бумажной прессе их вдоволь. Однако давайте посмотрим на ситуацию в историческом ракурсе.Когда Windows XP вышла, о ней писали то же
Африканские интернет-дроны как символ маразма ренессансной цивилизации Сергей Голубицкий
Африканские интернет-дроны как символ маразма ренессансной цивилизации Сергей Голубицкий Опубликовано 17 марта 2014 В мире происходят совершенно невероятные вещи. Гораздо более невероятные, на мой взгляд, чем нарушения территориальных
Из грязи в князи и обратно: обо что споткнулась HTC и сможет ли подняться? Евгений Золотов
Из грязи в князи и обратно: обо что споткнулась HTC и сможет ли подняться? Евгений Золотов Опубликовано 26 февраля 2013 Когда речь заходит о больших промахах в мобильной индустрии, принято вспоминать Research In Motion, Microsoft, Nokia. Все они были лидерами в том или ином сегменте
Глава 9. Обратно к истокам
Глава 9. Обратно к истокам Мы хотим сделать все, что от нас зависит, для того чтобы получить стабильный, предсказуемый процесс разработки программного продукта. Однако у нас нет времени на что-либо лишнее. Четыре основных рода деятельности, которые составляют собой