Раздел «Язык Ruby».SimpleSamples:

Сборная солянка различных примеров

Содержание

Простые примеры

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"

Две функции — функцию доступа и функцию записи переменной экземпляра класса @msg можно определить одной строкой 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