Сборная солянка различных примеров
Содержание
- Простые примеры
- Таблица умножения
- Промежутки, методы
map
,each
,grep
,select
.. - Ассоциированные блоки (
yield
, методыtreeTimes
,times
) - Генератор чисел Фибоначчи (
yield
, методtimes
) - Генератор случайных чисел (
yield
, методtimes
) - Класс =Hello=
- Класс =Stack=
- Метод
inject
- Считать, разбить, превратить в числа, отсортировать, удалить повторения и напечатать
Простые примеры
puts "Hi" puts -7 # -> -7 puts -7.class # -> Fixnum puts -7.abs # -> 7 puts "7 + 5 =", 7 + 5 # -> 7 + 5 = 12 puts "Hello" + ", " + "world" puts "Hello".class # -> String puts [4,6,7,8,1,234,-9].sort.join(" ") # -> -9 1 4 6 7 8 234 a = [4,6,7,8,1,234,-9]; a.each {|x| printf("%5d", x) } #-> 4 6 7 8 1 234 -9 print a.join(",") b = a.sort # Отсортировать массив и результат поместить b # (сам массив a не меняется) a.sort! # Отсортировать массив (массив a меняется) print a.join(",") print ([7,6,5,] + [1,1,1,768]).join(" "), "\n"
Таблица умножения
(1..10).each do |x| (1..10).each do |y| printf "%5d", x*y end puts end
Промежутки, методы map
, each
, grep
, select
..
# квадраты первых 20 натуральных чисел (1..20).map {|x| x*x}.each {|x| puts x} # простые числа меньше 1000 primes = (1..1000).select {|x| x.prime? } # 3-х буквенные слова, содержащие букву 'r' ("aaa".."zzz").grep(/r/).each {|x| puts x}
Ассоциированные блоки (yield
, методы treeTimes
, times
)
Команда yield
используется внутри методов
и означает "передать управление ассоциированному блоку" или "вызвать ассоциированный блок".
def threeTimes yield yield yield end threeTimes { puts "Hi" } puts 100.times { print "Hello"}
yield
должен вызываться с параметрами.
Генератор чисел Фибоначчи ( yield
, метод times
)
def gen_fibonacci(count) a,b = 1,0 if block_given? count.times do a, b = a + b, a yield b end else res = [] count.times do a, b = a + b, a res.push b end res end end gen_fibonacci(100) { |f| puts f } puts gen_fibonacci(100).join(",")
Генератор случайных чисел (yield
, метод times
)
def gen_random(from, to, n) n.times do yield from + (to-from)*rand end end gen_random(1,4,100) do |x| puts x end
Класс Hello
class Hello def initialize @msg = "Hello" end def msg @msg end def msg=(m) @msg = m end def say puts @msq end end h = Hello.new puts h.msg # prints "Hello" h.msg = "Hi" puts h.msg # prints "Hi" h.say # prints "Hi"
attr_reader :msg
:
class Hello attr_reader :msg def initialize @msg = "Hello, World\n" end end
Класс Stack
Этот класс определять в Ruby не нужно, так как массивы (экземпляры класса Array)
уже поддерживают интерфейс стека, то есть имеют методы pop
и push
(а заодно shift
и unshift
).
Но тем не менее, для иллюстрации идеи:
class Stack def initialize @data = [] end def push(x) @data.push(x) end def pop @data.pop end def empty? @data.empty? end end st = Stack.new (1..5).each do |x| st.push x end while !st.empty? puts st.pop end
Метод inject
# Сумма всех элементов массива puts [4,6,5,4,3,6,7,5].inject(0) {|f,i| f+i } # Произведение всех элементов массива puts [4,6,5,4,3,6,7,5].inject(1) {|f,i| f*i } # Факториал puts (1..gets.to_i).inject(1) {|f,i| f*i } # Массив превращаем в хэш puts [4,6,5,4,3,6,7,5].inject(Hash.new) {|f,i| f[i]=true }
Array
:
class Array # для примера определим метод inject, хотя он и так определён в Ruby Core def inject(n) each { |value| n = yield(n, value) } n end # def sum inject(0) { |n, value| n + value } end # def product inject(1) { |n, value| n * value } end end puts [1,2,3,4,5].product
Считать, разбить, превратить в числа, отсортировать, удалить повторения и напечатать
Пишется почти также, как и слышится:puts gets.split.map{|x| x.to_i}.sort.uniq
class Object # для тех, у кого нет метода puts (он есть, например, у IO), определим его def puts STDIO.puts self end end gets.split.map{|x| x.to_i}.sort.uniq.puts