Rdoba
Rdoba, сирѣчь руби-добавокъ, есть библиотека, расширяющая основныя классы Ruby такія какъ: Объектъ(Object), Ядро(Kernel), Строка(String), Словарь(Hash), Наборъ(Array), Пущь(NilClass) и т.д. Включаетъ модули и такія функціи:
- common - нѣкоторые простые меѳоды къ Объекту, Ядру, Пущю, Набору, Строкѣ и Словрю;
- a - чтеніе и запись значеній въ Наборъ и Словарь по индеѯу;
- combinations - перечисленіе значеній Набора въ различномъ порядкѣ;
- gem - нѣкоторыя методы бисера Rdoba, въ частности определенія оси и корневой папки бисера;
- mixin - примѣси, которыя могутъ быть подмѣшаны въ основныя классы рубинки;
- dup - функціи удвоенія Словаря и Набораъ, включая ихъ вложенія;
- hashorder - перечисленіе значеній Словаря въ заданномъ порядкѣ;
- numeric - разширенный переводъ числа въ строку и строки въ число;
- require - вложенная загрузка файловъ функціею require;
- roman - переводъ римскаго числа въ строку и строки въ римское число;
- deploy - развёртка YAML-шаблоновъ;
- fe - исправленіе кодировки въ Строкахъ (будетъ удалено по исправленіи въ ruby);
- io - функціи sscanf и sprintf съ дополнительными свойствами;
- re - простое преобразованіе Строки въ Правило;
- strings - разширеніе нѣкоторыхъ функцій Строки кириллическими правилами;
- yaml - упрощённая функція перевода Словаря или Набора въ YAML-документъ.
- os - меѳодъ merge для OpenStruct, а также нѣкторые меѳоды поддержки.
Использованіе
Общія методы
Добавляетъ нѣкоторыя простыя методы къ Объекту, Ядру, Пущю, Набору, Строкѣ и Словарю;
require 'rdoba/common'
Чтеніе и запись по индексу
Функціи позволяютъ читать и писать значенія въ Наборъ и Словарь по заданному въ видѣ Набора значеній индексу.
require 'rdoba/a'
h = { "ключъ 1" => [ 'знч', 'знч2' ],
"ключъ 2" => { "ключъ 3" => "знч3" } }
h.geta( [ "ключъ 2", "ключъ 3" ] ) # => "знч3"
h.geta( [ "ключъ 1", 0 ] ) # => "знч"
h.seta( [ "ключъ 2", "ключъ 3" ], 'НОВОЕ' ) # => "НОВОЕ"
h # => {"ключъ 1"=>["знч", "знч2"], "ключъ 2"=>{"ключъ 3"=>"НОВОЕ"}}
Перечисленіе значеній Набора
Перечисляетъ значенія Набора въ различныхъ ихъ кучныхъ комбинаціяхъ въ количествѣ 2^(Ѯ-1), гдѣ Ѯ - длина Набора. Существуетъ возможность прямаго или обратнаго перечичленія.
require 'rdoba/combinations'
a = [ 1,2,3 ]
a.each_comby do |x|
puts x.inspect
end
# получаемъ:
# [[1], [2], [3]]
# [[1], [2, 3]]
# [[1, 2], [3]]
# [[1, 2, 3]]
a.each_comby(:backward) do |x|
puts x.inspect
end
# получаемъ:
# [[1, 2, 3]]
# [[1, 2], [3]]
# [[1], [2, 3]]
# [[1], [2], [3]]
Методы бисера Rdoba
Rdoba.os
Методъ возвращаетъ видъ оси, на которой былъ запущенъ руби.
require 'rdoba'
Rdoba.os # » "linux"
Rdoba.gemroot
Методъ принимаетъ на входѣ параметръ имени бисера, и возвращаетъ корневую папку онаго бисера.
require 'rdoba'
Rdoba.gemroot 'rdoba' # » "/home/malo/git/rdoba"
Методы бисера Rdoba
Модуль содержитъ примѣсныя методы, которыя могутъ быть подмѣшаны въ основныя классы рубинки.
Пусто ли? (Is it empty?)
Проверяет пуста ли переменная.
require 'rdoba'
rdoba :mixin => [ :empty ]
nil.empty? # » true
false.empty? # » false
Object.new.empty? # » false
Пречинение Набора в Словарь (Array to Hash)
Преобразуетъ Набор в Словарь по определённымъ правиламъ.
require 'rdoba'
rdoba :mixin => [ :to_h ]
[ 'aa', 0,
'bb', 1 ].to_h # » {"aa"=>nil, 0=>nil, "bb"=>nil, 1=>nil
[ [ 'aa', 0, ],
[ 'bb', 1 ] ].to_h # » {"aa"=>0, "bb"=>1}
[ [ 'aa', 0, 1, ],
[ 'bb', [ 1, 0 ] ] ].to_h # » {"aa"=>[0, 1], "bb"=>[1, 0]}
[ [ 'aa', 0, ],
[ 'aa', 1 ] ].to_h # » {"aa"=>[0, 1]}
[ [ 'aa', 0, ],
[ 'aa', 0 ] ].to_h # » {"aa"=>[0, 0]}
[ [ 'aa', 0, ],
[ 'aa', 0 ] ].to_h( :save_unique => true ) # » {"aa"=>[0]}
Пречиненье пуздры (Change a case)
Переводъ строки въ верхнее значеніе. Функція можетъ принимать дополнительное значеніе 'FirstChar', которое принуждаетъ переводить не всю строку, а только первый знакъ. Переводъ знака въ нижнее значеніе. Функція можетъ принимать дополнительное значеніе 'FirstChar', которое принуждаетъ пе реводить не всю строку, а только первый знакъ.
require 'rdoba'
rdoba :mixin => [ :case ]
a = 'строка'
a.upcase # => "СТРОКА"
a = 'строка'
a.upcase( :first_char ) # => "Строка"
a = 'СТРОКА'
a.downcase # => "строка"
a = 'СТРОКА'
a.downcase( :first_char ) # => "сТРОКА"
Обратка (reverse)
Обращаетъ строку. Допускается проводить обращеніе съ перемѣннымъ шагомъ, а также побайтно.
a = 'строка'
# обычное обращеніе
a.reverse # => "акортс"
# побайтное обращеніе
a.reverse(String::ByteByByte) # =>"\xB0\xD0\xBA\xD0\xBE\xD0\x80\xD1\x82\xD1\x81\xD1"
# обращеніе съ шагомъ 2
a.reverse(2) # => "карост"
Сравнена съ (compare_to)
Работаетъ такъ же какъ и '<=>', но можетъ принимать дополнительное значеніе ignore_diacritics, которое вынуждаетъ методъ проводить сравненіе отбрасывая надстрочники:
a = 'а҆́гнецъ'
b = 'а҆гкѵ́ра'
a <=> b # => -1
a.compare_to(b) # => -1
a.compare_to(b, :ignore_diacritics) # => 1
a.compare_to(b, :ignore_diacritics => true) # => 1
Одвоеніе Словаря и Набора
Позволяетъ выполнять какъ обычное, такъ и вложенное одвоеніе Словаря или Набора.
require 'rdoba/dup'
a = [ 'aaa', 'bbb' ]
# выполняемъ обычное одвоеніе
b = a.dup
a[0].replace 'ccc'
a # => ["ccc", "bbb"]
b # => ["ccc", "bbb"]
# выполняемъ вложенное одвоеніе
c = a.dup(:recursive)
a[0].replace 'ddd'
a # => ["ddd", "bbb"]
c # => ["ccc", "bbb"]
Перечисленіе значеній Словаря въ заданномъ порядкѣ
Позволяетъ перебрать всѣ ключи и значенія Словаря по опредѣлённому порядку. Порядок сей задаётся свойствомъ Словаря :order. Если въ заданном порядкѣ не всѣ ключи опредѣлены, то сначала перебираются заданныя ключ, а затѣмъ уже остальныя въ порядкѣ какъ они заданы въ Словарѣ. Перебирать можно ключи, пары или значенія по ключамъ. 4 метода суть перебора: each, each_pair, each_key, each_value. Удаляется порядокъ методом disorder.
require 'rdoba/hashorder'
h = { "ключъ 1" => [ 'знч', 'знч2' ],
"ключъ 2" => { },
"ключъ 3" => "знч3" }
# простой переборъ паръ
h.each do |x,y|
puts x
end
# выводъ
# ключъ 1
# ключъ 2
# ключъ 3
# переборъ паръ
h.order = ['ключъ 2','ключъ 3','ключъ 1']
h.each_pair do |x,y|
puts x
end
# выводъ
# ключъ 2
# ключъ 3
# ключъ 1
# переборъ ключей
h.order = ['ключъ 2']
h.each_key do |x|
puts x
end
# выводъ
# ключъ 2
# ключъ 1
# ключъ 3
# переборъ значеній къ уже упорядоченнымъ ключамъ
h.order = ['ключъ 2','ключъ 3','ключъ 1']
h.each_value do |x|
puts x.inspect
end
# выводъ
# {}
# "знч3"
# ["знч", "знч2"]
# удаленіе порядка
h.disorder
Разширенный переводъ чиселъ
Добавка позволяетъ преобразовывать:
-
Строку въ Число по заданному основанію, а также задавать порядокъ слѣдованія цифръ;
-
Число въ Строку, задавая основаніе, заполненіе нулями Строки до опредѣлённой ширины и обрамленіе числа въ строкѣ;
-
Число въ потокъ данныхъ въ видѣ Строки.
require 'rdoba/numeric'
Строка -> Число
'1010'.to_i(2) # => 10 '0xFE'.to_i(16) # => 254
Big-endian число
'-123'.to_i(8, :be) # => -209 (-0321)
Число -> Строка
1020.to_s(16, { :padding => 10 }, :style_formatting) # => "0x00000003FC"
Число -> данныя въ Строкѣ
1020.to_p(16, { :padding => 5 }, :be) # => "\x00\x00\x00\x03\xFC" 1020.to_p(16, { :padding => 5 }) # => "\xFC\x03\x00\x00\x00"
Вложенная загрузка модулей
Добавка позволяетъ загружать ruby-файлъ съ подпапками.
require 'rdoba/require'
# есть у васъ файловая структура:
# x.rb
# x/y.rb
# x/z.rb
# можно загрузить её разомъ такъ:
require 'x', :recursive
Обработка римскихъ чиселъ
Добавка позволяетъ преобразовывать римскія числа въ Строку и изъ неё.
require 'rdoba/roman'
'XVI'.rom # => 16
144.to_rom # => "CXLIV"
Развёртка YAML-шаблоновъ
require 'rdoba/deploy'
Исправленіе кодировки въ Строкахъ
Исправляетъ кодировку Строки въ ruby 1.9 въ Encoding.default_internal. Если оно не задано, то въ 'UTF-8'. Часто такой финтъ нуженъ для въставленія совместимости забугорныхъ приложеній и кириллицы.
!!! будетъ удалено по исправленіи въ ruby
require 'rdoba/fe'
s = 'eee'
s.encoding # => #<Encoding:US/ASCII>
s.fe
s.encoding # => #<Encoding:UTF-8>
Новыя функціи sscanf, sprintf и consolize
Въ функциію sprintf добавленъ ключъ 'P', позволяющій сохранить просто данныя чего-либо (въ частности Числа) въ строку. Функціи 'scanf' и 'consolize' у Строки позволяютъ разбирать строку согласно переданнымъ въ scanf ключамъ и прощать строку, убирая лишние знаки \r, соотвѣтственно.
sprintf
Форматъ ключа 'P' функціи sprintf: %сдвигъ.заполненіе+P
-
сдвигъ есть сдвигъ новой строки от начала въ пробѣлахъ;
-
заполненіе есть дополненіе преобразованного въ Строку Числа нулями;
-
- сообщаетъ о томъ, что Число нужно выразить въ big-endian.
require 'rdoba/io'
sprintf "%5P", 1000 # => " \xE8\x03" sprintf "%.5P", 1000 # => "\xE8\x03\x00\x00\x00"
sprintf "%5.10+P", 1000 # => " \x00\x00\x00\x00\x00\x00\x00\x00\x03\xE8"
scanf
Позволяетъ преобразовать согласно заданной строкѣ ключей. Ключи здѣ такія же какъ в Kernel::sprintf.
s = 'значеніе = 1000'
s.scanf "%s = %i" # => [["значеніе", 1000]]
consolize
Функція упрощаетъ содержимое строки, как бы при выводѣ её на консоль.
s = "string\rval"
s.consolize # => "valing"
Преобразованіе Строки въ Правило
require 'rdoba/re'
a = 'строка.'
b = 'доп.строка.доп'
a.to_res # => "строка\\."
a.to_re # => /строка\./i
b.match a.to_re # => #<MatchData "строка.">
Новыя методы класса
Новыя методы экземпляра
Новыя методы для ruby 1.8
ord
Возвращаетъ числовой кодъ перваго знака строки:
a = 'ёжъ'
a.ord # => 1025 (0x401)
Упрощённый переводъ въ YAML
Позволяетъ простенько перевести экземпляры классовъ Словаря, Набора, Строки и Числа въ YAML-документъ. Также возможно указать порядокъ выведенія ключей въ Словарѣ.
h = { "ключъ 1" => [ 'знч', 'знч2' ],
"ключъ 2" => 10 }
puts h.to_yml
---
ключъ 2: 10
ключъ 1:
- знч
- знч2
puts h.to_yml(:order => ["ключъ 1", "ключъ 2"])
---
ключъ 1:
- знч
- знч2
ключъ 2: 10
puts h.to_yml(:order => ["ключъ 2", "ключъ 1"])
---
ключъ 2: 10
ключъ 1:
- знч
- знч2
Модули
os
Добавляемъ въ OpenStruct возможность поплетать её съ другою OpenStruct. Поплетаніе происходитъ глубоко, и переборъ проходится по всѣмъ вложеннымъ полямъ. Всѣ наборы превращаются въ экземпляры OpenStruct съ ключами въ видѣ чиселъ. Словари становятся также экземплярами OpenStruct, экземпляры же остальныхъ видовъ остаются тѣми же самыми.
require 'rdoba/os'
И используемъ какъ:
os1 = OpenStruct.new(hash1)
os2 = OpenStruct.new(hash2)
os3 = os1.merge(os2) # Новый OpenStruct
Права
Авторскія и исключительныя права (а) 2011 Малъ Скрылевъ Зри LICENSE за подробностями.